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();
}
}
}
看了代码之后其实很简单吧!
<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();
}
}
}
看了代码之后其实很简单吧!
相关文章推荐
- 【Spring学习04】实例化上下文对象及加载多个配置文件
- JVM加载class文件的原理机制
- Spring如何扫描class和配置文件
- Java加载Class文件的原理机制
- 描述一下 JVM 加载 class 文件的原理机制?
- 请慎用spring-ClassPathXmlApplicationContext手动加载spring配置文件
- 【Java面试题】46 描述一下JVM加载class文件的原理机制?
- 描述一下JVM 加载class文件的原理机制?
- 描述一下JVM加载class文件的原理机制?
- JVM加载class文件的机制
- JVM 加载class文件的原理机制
- Spring的classpath与classpath*通配符加载配置文件
- JVM加载class文件的原理机制?
- JVM加载class文件的原理机制
- JVM加载class文件的原理机制
- Spring如何扫描class和配置文件
- 关于Class对象、类加载机制、虚拟机运行时的内存布局的全面解析和推测
- 描述一下JVM加载class文件的原理机制?
- unreal3对象属性自动从配置文件中加载的机制
- JVM加载class文件的原理机制