来源:达内Java培训学校
时间: 2022/3/28 10:29:37
重庆java培训告诉你如何用反射做简易Spring IOC容器?在学习Spring之后,对其中的工作原理产生了浓厚的兴趣,近些日子了解了一些SpringIOC容器的工作原理,并边打边磨做出了一个非常简易的SpringIOC容器,实现了他的XML文件装配,java代码装配以及自动装配的功能,下面是小编整理的思路以及代码
模仿XML形式的装配思路
1.思路
采用XML装配bean时Spring会解析applicationContext.xml文件,并将各种类型的bean注入IOC容器,容器中的bean可以被无数次重复调用,极大地提高了系统效率而不用多次重复的new对象。
为了模仿IOC,我们利用Map集合存放需要的bean,并新建一个conf.properties文件存放信息,存放com.wql.dao.userDao=com.wql.daoImpl.userDaoImpl等数据信息
在获取bean之前解析conf.properties文件中的信息,利用反射技术将conf.properties文件中的内容通过Class.forName的形式解析为Class对象放入集合map中,这样每次获取对象都会从map中进行获取,不必再new
2.具体代码实现
conf.properties:
com.wql.dao.userDao=com.wql.daoImpl.userDaoImpl
com.wql.service.userService=com.wql.serviceImpl.userServiceImpl
MyApplicationContext类代码实现:
package com.wql.application;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class MyApplicationContext<T>{
//模拟IOC容器
private Map<Class,Object>map=new HashMap<>();
private String ResourcePath;
private String filepath;
public MyApplicationContext(){
}
public MyApplicationContext(String resourcePath){
ResourcePath=resourcePath;
}
//获得一个类型不知的对象(通过map集合)
public T getBean(Class clazz){
return(T)map.get(clazz);
}
//通过properties中存储的键值对获取Class对象,并注入进map集合
public void initXMLSpringIOC(){
try{
InputStream stream=MyApplicationContext.class.getClassLoader().getResourceAsStream(ResourcePath);
Properties properties=new Properties();
properties.load(stream);
//获取内容
Set<Object>keys=properties.keySet();
for(Object key:keys){
//Class:实例
map.put(Class.forName(key.toString()),Class.forName(properties.getProperty(key.toString())).newInstance());
}
}catch(Exception e){
e.printStackTrace();
}
}
}