`
JackyCheng2007
  • 浏览: 253773 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
文章列表
众所周知,Spring以其强大而又灵活的IoC管理功能著称。IoC本质上是通过依赖注入DI的方式实现组件之间的解耦。其实在DI模式下,一个关键性的角色是装配器(assembler)。应用程序的组件A在引用别的组件B的时候不用通过new来创建,而是依赖一个第三方的装配器创建好B,然后再通过setter或者constructor来注入给A,这样A只管用B的接口,而不需要知道B的存在,从而实现了A与B的解耦。也实现了面向抽象(接口)编程。 Spring框架里面谁来充当这个assembler的角色呢?是BeanFactory。Spring提供了品种繁多的BeanFactory,共用户在不同场合下使用。 ...
分析appfuse的详细的启动日志来看看Spring的启动过程。 1. 装载app上下文 main INFO org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization started 。。。。。。。。。。 main INFO org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 22509 ms 这里是通过 ...
千里之行,始于足下。结合例子学习概念,比较靠谱。本文介绍如何开始从appfuse开始学习Spring和Hibernate。 如果你还没有安装mysql,请先安装。同时也建议你安装一个workbench来方便管理数据库。 1. 利用Maven构建appfuse项目 万能的Maven提供了很多丰富的Archetype让你可以轻松构建一个包含了你想使用的框架的基本项目,而避免让你从零开始。你可以在这里(http://docs.codehaus.org/display/MAVENUSER/Archetypes+List)查看Maven提供的所有Archetype。 在命令行输入下面的命令,你就可以根据 ...
有时候需要使用多线程来提高对于CPU,尤其是多核CPU的利用率,来提高性能。Spring的bean一般都是无状态的,单例的。所以也就是线程安全的。那么对于声明式的事务,在多线程环境下又是怎么处理的呢? 看看下面的例子: ClassA.java @Transactional public void methodA(){ ExecutorService executorService = Executors.newFixedThreadPool(4); executorService.execute(new Runnable() { p ...
在功能上讲Hashtable和HashMap, Vector和ArrayList有着几乎相同的功能。他们的主要区别在于: Hashtable和HashMap的区别,先看put方法的源代码 Hashtable public synchronized V put(K key, V value) { // Make sure the value is not null if (value == null) { throw new NullPointerException(); } // Makes sure the key is not already in the ...
最近再看Java 性能的问题。一直都习惯使用Jconsole和Jstack。今天偶然发现一个更好的东东JVisualVM。这个工具功能更强大而且有很多插件可以扩展,相信后面插件会越来越丰富。 如此一来一些简单的profiling和monitoring需求都可以满足了,而不必使用JProfile和YourKit了。 JVisualVM是JDK自带的一个使用工具。如果你的path里面包含java的bin目录,你可以直接在命令行敲JVisualVM来打开它。 你可以连接本机,也可以连接远程的机器,不过要通过jmx。需要做下面的设置: set JAVA_OPTS=-Dcom.sun.management ...
为了性能和内存资源上的考虑,JVM对String类型的数据做了特殊的处理。也就是大家都知道的String是immutable的或者是constant。其实很多面试或者笔试里面都会考到。有时觉得没事找事,确实,对于一般的系统,不需要考虑到底创建 ...
在学习Tomcat 7 的源代码的时候发现,大量运用到了JMX, MBeans,所以决定先学习一下。 介绍 JMX是Java 5开始引入的API。这个API意在帮助管理和监控资源: applications, devices, services, and the Java virtual machine. 你可以用JMX API来:     查询和修改应用配置     应用行为统计     状态改变和出错通知 你也可以远程的访问JVM,从而远程管理和监控。 MBean, managed bean,受管的bean Mbean其实也是一种Java Bean,特别之处就在于它是在管理之下的。所谓 ...
Bootstrap 在启动的时候初始化了三种class loader:common,server和shared。在它的createClassLoader方法里面,通过: String value = CatalinaProperties.getProperty(name + ".loader"); 来得到属性文件catalina.properties里面获得他们的配置: common.loader=${ ...
先大致浏览一下整个启动过程吧。下面是org.apache.catalina.startup.Bootstrap的main函数。 我在eclipse调用的是start的命令,也就是传入main的参数是start // 初始化, 构建org.apache.catalina.startup.Catalina实例,并赋值给catalinaDaemon bootstrap.init(); // ...
准备好好研究学习一下tomcat 7 的源代码,那么第一步就是下载,导入eclipse并且运行。 1. 下载源代码 tomcat 7 的源代码在svn上,所以你需要svn的安装。创建一个目录tomcat7,并用命令行进入这个目录,之后用下面的命令下载 svn co http://svn.apache.org/repos/asf/tomcat/tc7.0.x/tags/TOMCAT_7_0_27/ ./ 这里我下载的是tag里面的,你也可以下载别的branch,比如trunk,但是我觉得tag的是比较稳定的。 2. 创建eclipse项目 tomcat 7 是用ant来构建和管理的,所以 ...
        泛型是Java 5开始引入的一个语言级别的特性,目的是为了让你的程序更为可靠(reliable)。         程序总是有bug,而bug分为编译时bug和运行时bug,编译时bug是比较令人舒服的bug,因为大部分的IDE比如eclipse,就能让你在写代码的时候就能发现并及时fix。但是运行时bug就很难受了,必须在运行时的某个条件下才能出现,当你想去找它的时候还不一定那么好找,尤其是多线程环境下的bug,更难重现。我们如果能尽量使bug可以在编译时发现,那就再好不过了。         泛型的引入就是为了让你尽量在编译时就发现某些类型的bug。典型的例子就是Collec ...
Java的执行过程也就是JVM从启动到退出的过程。JVM的运行是一个进程单元,可以用jps工具列举出正在运行的JVM 进程。在一个JVM进程中可以运行多个线程。 1. JVM 启动 当用java工具运行一个编译好的class文件的时候,比如下面的命令,我们就通过调用Test的main函数启动了一个JVM进程。并且传给main函数一个字符串数组{"reboot", "Bob", "Dot", "Enzo"} java Test reboot Bob Dot Enzo 2. 加载类Test 如果JVM发现Test类还没有 ...
在环境配置中我们经常需要知道或者设置系统属性值和环境变量。系统属性值是在同一个Java process里面有效的全局变量。而环境变量则是对于整个操作系统中所有进程都可见的,就如同你在OS里面设置的一样。因此除非必要,或者你确实需要环境变量,比如classpath和path,一般推荐使用properties。比如log4j的属性文件的使用。 下面的代码可以打印出所有的系统变量和环境变量: package jdk.lang; import java.util.Enumeration; import java.util.Iterator; import java.util.Map; ...
System类提供了数组copy函数:     public static native void arraycopy(Object src,  int  srcPos,                                         Object dest, int destPos,                                         int length); 从参数列表上看,src和dest都是Object,说明可以copy任意数组。那么我们知道数组既可以是原始类型值的数组,也可以是对象类型的数组。如果是原始类型的数组,copy的就是值,如果是对 ...
Global site tag (gtag.js) - Google Analytics