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的注册。
外部配置文件方式
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>