您的位置:首页 > 编程语言 > Java开发

Java类加载机制 .class文件加载 .class文件实例化对象 Spring自动包扫描Bean原理

2012-10-15 15:49 447 查看
        呵呵,大家用过spring有些年头的朋友可能知道,原来我们在项目开发的过程中需要在spring的配置文件applicationContext.xml中手动配置我们的实体bean,然后还需要手动配置对象间的依赖关系。然而现在,开发过程中只需要在applicationContext.xml文件中加入:

<context:component-scan base-package="包名前缀" />

这样spring就会自动去搜索包里面的实体,当然还需要我们给需要被扫描的实体增加annotation注解,这里就不说了!
这里想介绍的是spring这样的扫描原理:

实际上他是去文件系统上面,也就是磁盘上读取编译后的.class文件,然后再实例化成对象,然后再通过annotation配置构造关系!

下面贴出代码:

首先,我们需要去继承ClassLoader这个类,扩展里面的loadClass方法

public class MyClassLoader extends ClassLoader {
@SuppressWarnings("unchecked")
public Class loadClass(String name,byte[] bs,int length){
return super.defineClass(name,bs, 0, length);
}
}


接着就是测试类了:
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class Test {

@SuppressWarnings("unchecked")
public static void main(String[] args) {

try {

MyClassLoader loader = new MyClassLoader();

File folder = new File("bin/com/bling/core/bean");

if(folder.isDirectory()){

File[] fs = folder.listFiles();

byte[] bs = null;

InputStream in = null;

int length = 0;

Class cls = null;

for(File f:fs){

in = new FileInputStream(f);

bs = new byte[in.available()];

length = in.read(bs);

cls = loader.loadClass(null, bs, length);

System.out.println(cls.newInstance());
}

}
}catch(Exception ex){
ex.printStackTrace();
}
}
}


看了代码之后其实很简单吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: