Spring是最常见的框架,那么他的内在机制是什么呢?
public class TestBean {
private String str = "haha";
public String getStr() {
return str;
}
}
public class TestSpring {
public static void main(String[] args) {
DefaultListableBeanFactory f = new XmlBeanFactory(new ClassPathResource("test.xml"));
System.out.println(f.getBeanDefinitionCount());
TestBean bean = (TestBean) f.getBean("testStr");
System.out.println(bean.getStr());
}
}
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id = "testStr" class="cn.pn.spring.TestBean"></bean>
</beans>
为什么通过这样一种方式就直接获取到了Bean实例呢?
猜想一下,我们要定义了Bean,然后定义配置文件,就可以获取了。它的内在机制应该是拿到配置文件信息,根据反射获取Bean的实例。
那么就有两个重点。
获取Bean的配置信息,可以是xml可以是注解。
根据配置信息去装配Bean,延迟加载或者直接实例化。
画了一下XmlBeanFactory的结构图:
最顶级的BeanFactory接口定义了Bean的基本功能:获取bean的模板方式和判断bean的属性。
实现它的有三个扩展接口:
AutowireCapableBeanFactory:顾名思义这个扩展接口主要定义的功能是:自动装配的方式,bean的依赖关系,包含了Bean的初始化和销毁,我的理解是定义了bean的生命周期功能。
HierarchicalBeanFactory:这个接口定义了两个方法,获取父类Bean工厂和判断是否包含本级的bean,如果看过Servlet源码能理解这个地方,让子类能专注做自己的事情。
ListableBeanFactory:一句话解释就是,提供了获取所有bean的配置清单,而不是显示调用getBean的时候去实例化Bean,换句话说就是获取非延迟加载的bean工厂都需要实现这个接口。包含了获取bean的几种方式,bean的数量和name。
下面描述一下其他的类:
AliasRegistry:定义了对alias的简单增删改等操作。
SingletonBeanRegistry:定义了对单例的bean的注册和获取。
ConfigurableBeanFactory:提供了配置factory的各种方法,scope,bean的依赖等各种方法。