Spring解密笔记: BeanFactory的对象注册与依赖绑定方式

BeanFactory

BeanFactory作为一个IoC Service Provider,为了能够明确管理各个业务对象以及业务对象之间的
依赖绑定关系,同样需要某种途径来记录和管理这些信息。我们提到通常会有三种方式来管理这些信息。而BeanFactory几乎支持所有这些方式

BeanFactory的关系图

BeanFactory只是一个接口,我们最终需要一个该接口的实现来进行实际的Bean的管理,DefaultListableBeanFactory就是这么一个比 较通用的BeanFactory实现类。

DefaultListableBeanFactory除了间接地实现了BeanFactory接口,还实现了BeanDefinitionRegistry接口,该接口才
是在BeanFactory的实现中担当Bean注册管理的角色

基本上, BeanFactory接口只定义如何访问容器内管理的Bean的方法,各个BeanFactory的具体实现类负责具体Bean的注册以及管理工作。

BeanDefinitionRegistry接口定义抽象了Bean的注册逻辑。通常情况下,具体的BeanFactory实现
类会实现这个接口来管理Bean的注册。

BeanFactory的关系图

外部配置文件方式

1. Properties配置格式的加载

代码清单4-5 Properties格式表达的依赖注入配置内容
djNewsProvider.(class)=…FXNewsProvider
---------通过构造方法注入的时候-------------
djNewsProvider.$0(ref)=djListener
djNewsProvider.$1(ref)=djPersister
---------通过setter方法注入的时候---------
djNewsProvider.newsListener(ref)=djListener
djNewsProvider.newPersistener(ref)=djPersister

djListener.(class)=…impl.DowJonesNewsListener
djPersister.(class)=…impl.DowJonesNewsPersister

	public static void main(String[] args)
{ 
	**//创建默认的类定义列表**
	DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
	**//把BeanDefinition注册进BeanFactory**
	BeanFactory container = (BeanFactory)bindViaPropertiesFile(beanRegistry);
	**//此时BeanFactory已经有了我们注册了的Bean了, 可以直接调用了**
	FXNewsProvider newsProvider =
	(FXNewsProvider)container.getBean("djNewsProvider"); 12
	newsProvider.getAndPersistNews();
}
**// 默认的类定义列表对象, 进行注册作用(实现了BeanDefinitionRegistry 接口的方法)**
public static BeanFactory bindViaPropertiesFile(BeanDefinitionRegistry registry)
	{
	**// 这里就使用了BeanDefinitionReader具体的properties实现类PropertiesBeanDefinitionReader ,去读取properties文件了**
		PropertiesBeanDefinitionReader reader =
		new PropertiesBeanDefinitionReader(registry);
		reader.loadBeanDefinitions("classpath:../../binding-config.properties");
	    return (BeanFactory)registry;
	}

2. XML配置格式的加载

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" ➥
"http://www.springframework.org/dtd/spring-beans.dtd">
	<beans>
	<bean id="djNewsProvider" class="..FXNewsProvider">
		<constructor-arg index="0">
			<ref bean="djNewsListener"/>
		</constructor-arg>
		<constructor-arg index="1">
			<ref bean="djNewsPersister"/>
		</constructor-arg>
	</bean>
	<bean id="djNewsListener" class="..impl.DowJonesNewsListener">
	</bean>
	<bean id="djNewsPersister" class="..impl.DowJonesNewsPersister">
	</bean>
</beans

public static void main(String[] args)
{
//创建默认的类定义列表
DefaultListableBeanFactory beanRegistry = new DefaultListableBeanFactory();
//把BeanDefinition注册进BeanFactory
BeanFactory container = (BeanFactory)bindViaPropertiesFile(beanRegistry);
//此时BeanFactory已经有了我们注册了的Bean了, 可以直接调用了
FXNewsProvider newsProvider =
(FXNewsProvider)container.getBean(“djNewsProvider”); 12
newsProvider.getAndPersistNews();
}
// 默认的类定义列表对象, 进行注册作用(实现了BeanDefinitionRegistry 接口的方法)
public static BeanFactory bindViaPropertiesFile(BeanDefinitionRegistry registry)
{
// 这里就使用了BeanDefinitionReader具体的xml实现类XmlBeanDefinitionReader ,去读取xml文件了
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(registry);
reader.loadBeanDefinitions(“classpath:…/news-config.xml”);
return // 或者直接 (BeanFactory)registry; 4
//return new XmlBeanFactory(new ClassPathResource("…/news-config.xml"));
}

3. 注解方式

只适用于应用程序使用了Spring 2.5以及Java 5
或者更高版本的情况之下。

@Component //称为组件, 被主键扫描, 扫描进容器BeanFactory
public class DowJonesNewsPersister implements IFXNewsPersister
{
...
}
@Component
public class DowJonesNewsListener implements IFXNewsListener
{
...
}
@Component
public class FXNewsProvider{
		@Autowired
		private IFXNewsListener newsListener;
		@Autowired
		private IFXNewsPersister newPersistener;
		public FXNewsProvider(IFXNewsListener newsListner,IFXNewsPersister newsPersister)
		{
		this.newsListener = newsListner;
		this.newPersistener = newsPersister;
		}
		...
}

最后只需在配置文件中加入 <context:component-scan base-package=“对应扫描包的位置”/> 即可扫描到各个组件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

			<context:component-scan base-package="cn.spring21.project.base.package"/>

</beans>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值