一、Spring创建bean原理:
在以前的Spring项目中,我们都会在xml中配置bean信息,比如id和类名。其实原理就是通过读取xml信息,对应生成相应的bean,并将bean放入缓存,以便快速访问使用。后来以注解的方式配置bean,其实原理都是差不多,通过反射去读取注解的信息,从而实例化类。
二、代码实例:
/**
* Car
*/
public class Car {
public void run() {
System.out.println("Car run..");
}
}
BeanFactory :
public interface BeanFactory {
Object getBean(String id) throws ExecutionException;
}
BeanFactory 实现类
/**
* BeanFactory实现类
*/
public class ClassPathXmlApplicationContext implements BeanFactory {
private Map<String, Object> map = new HashMap<String, Object>();
public ClassPathXmlApplicationContext(String fileName)
throws DocumentException, InstantiationException
, IllegalAccessException, ClassNotFoundException {
//加载配置文件
SAXReader reader = new SAXReader();
Document document = reader.read(ClassPathXmlApplicationContext.class
.getClassLoader().getResourceAsStream(fileName));
//获取根节点
Element root = document.getRootElement();
//获取子节点
List<Element> childElements = root.elements();
for (Element element : childElements) {
map.put(element.attributeValue("id"),
Class.forName(element.attributeValue("class")).newInstance());
}
}
@Override
public Object getBean(String id) throws ExecutionException {
return map.get(id);
}
}
application.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="car" class="com.spring.stu.Car">
</bean>
</beans>
测试类:
public class BeanFactoryTest {
public static void main(String[] args) throws InstantiationException,
IllegalAccessException, ClassNotFoundException
, DocumentException, ExecutionException {
BeanFactory beanFactory =
new ClassPathXmlApplicationContext("com/spring/application.xml");
Object obj = beanFactory.getBean("car");
Car car = (Car)obj;
car.run();
}
}