spring系列2-beanDefinition的载入与解析

目录

1. IOC容器的初始化过程

1.1 BeanDefinition的Resource定位

1.2 BeanDefinition的载入与解析

2. 静态工厂方法 vs. 工厂模式

2.1 spring中的应用

2.2 辨析

参考资料:


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/6844903475151634446https://www.cnblogs.com/sunpengblog/p/10397986.html

静态工厂方法:返回实例的静态方法

简单工厂模式:1个工厂类 + 1个抽象产品类(多个产品类继承)

工厂方法模式:1个具有抽象方法的工厂类(多个工厂类继承) + 1个抽象产品类(多个产品类继承)

抽象工厂模式:1(多)个具有抽象方法的工厂类(多个工厂类继承) + 多个抽象产品类

参考资料:

《spring技术内幕》

《spring源码深度解析(第2版)》

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值