目录
1. IOC容器的初始化过程
阅读spring源码一般从BeanFactory、ApplicationContext结合xml配置文件入手。
@Test
public void testBean() {
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("mytest/defaulttag/beanFactoryTest.xml"));
MyTestBean beanA = (MyTestBean) bf.getBean("a");
System.out.println(beanA);
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"mytest/applicationContext.xml"}, true, null);
MyBean myBean = context.getBean(MyBean.class);
System.out.println(myBean.getId());
}
1.1 BeanDefinition的Resource定位
如上述代码,基于XmlBeanFactory构建容器,直接创建resource,再loadBeanDefinition;而基于applicationContext构建容器,需要在loadBeanDefinition时“定位”resource。
根据上图的关系,抽象类abstractApplicationContext定位Resource的能力来源于:
(1)继承DefaultResourceLoader类 => ResourceLoader接口定义了从location解析单个资源的方法:Resource getResource(String location)
(2)创建、依赖成员变量resourcePatternResolver => ResourcePatternResolver接口定义了从locationPattern解析多个资源的方法:Resource[] getResources(String locationPattern)
1.2 BeanDefinition的载入与解析
大致解析过程如下图:
其中解析bean标签:
2. 静态工厂方法 vs. 工厂模式
2.1 spring中的应用
工厂方法应用:只配置factory-method属性(指向的方法是static的)
工厂简单模式应用:同时配置factory-method、factory-bean属性(指向的方法是非static的)
public class ChildFactory {
public Child getSon(String name){
Child child = new Child();
child.setSex("man");
child.setName(name);
return child;
}
public static Child getSon2(String name) {
Child child = new Child();
child.setSex("man");
child.setName(name);
return child;
}
}
<!-- factory-method属性:静态工厂方法名,class属性:静态工厂的全类名 -->
<bean id="factorySon2" class="bean.ChildFactory" factory-method="getSon2" primary="false">
<!-- 静态工厂方法参数 -->
<constructor-arg value="factory son2"></constructor-arg>
</bean>
<!-- factory-bean属性:工厂beanId,结合factory-method属性:工厂方法名 -->
<bean id="childFactory" class="bean.ChildFactory"/>
<bean id="factorySon" factory-bean="childFactory" factory-method="getSon" primary="true">
<!-- 工厂方法参数 -->
<constructor-arg value="factory son"></constructor-arg>
</bean>
2.2 辨析
代码参考:https://juejin.im/post/6844903475151634446、https://www.cnblogs.com/sunpengblog/p/10397986.html
静态工厂方法:返回实例的静态方法
简单工厂模式:1个工厂类 + 1个抽象产品类(多个产品类继承)
工厂方法模式:1个具有抽象方法的工厂类(多个工厂类继承) + 1个抽象产品类(多个产品类继承)
抽象工厂模式:1(多)个具有抽象方法的工厂类(多个工厂类继承) + 多个抽象产品类
参考资料:
《spring技术内幕》
《spring源码深度解析(第2版)》