JAVA && Spring && SpringBoot2.x — 学习目录
在Spring中有两种类型的bean,一种是普通Bean,一种是工厂Bean,即FactoryBean。FactoryBean跟普通bean不同,其返回的对象不是指定类的一个实例,而是该FactoryBean的getObject方法所返回的对象。创建出的对象是否属于单例由isSingleton中的返回决定。
1. 为什么使用FactoryBean
一般情况下,Spring通过反射机制,利用<bean>中的class属性指定的实现类实例化Bean。在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,需要在<bean>中提供大量的配置信息。配置方法的灵活性受限,这时采用编码方式可能会得到一个简单的方案。Spring为此提供了一个org.springframework.bean.factory.FactoryBean工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。可以隐藏实例化一些复杂Bean的细节。给上层应用带来便利。
从Spring3.0开始,FactoryBean开始支持泛型,即接口声明改为FactoryBean<T>的形式。
以Bean结尾,表示他是一个Bean,不同于其他bean的是:它实现了FactoryBean<T>的接口。该Bean的ID实际上是从BeanFactory中获取的实际的getObject()返回的对象,而不是FactoryBean本身。如果要获取FactoryBean对象,可以在id前面加一个&符号来获取。
2. FactoryBean是什么
package org.springframework.beans.factory;
public interface FactoryBean<T> {
//返回由FactoryBean创建bean的实例,如果是单例模式(isSingleton=true)
//则该实例会放在Spring容器单例的缓存池中。
T getObject() throws Exception;
//返回FactoryBean创建的Bean实例
Class<?> getObjectType();
//返回由FactoryBean创建的实例是单例还是多例的
boolean isSingleton();
}
当配置文件中<Bean>的class属性配置的实现类是FactoryBean时,通过getBean()方法返回的实际上是getObject的对象。
3. FactoryBean怎么用
FactoryBean通常是用来创建比较复杂的Bean,一般的bean使用XML配置即可,但若是一个Bean的创建过程中涉及到很多其他Bean 和 复杂的逻辑,使用XML配置比较复杂的话,这时可以考虑使用FactoryBean。
@Component
public class MyFactoryBean implements FactoryBean<List<String>>, InitializingBean, DisposableBean {
private static final Logger logger = LoggerFactory.getLogger(MyFactoryBean.class);
private String params = "";
private List<String> list;
//InitializingBean实现方法
public void afterPropertiesSet() throws Exception {
//属性注入完后,调用该方法,该方法可以实现“业务”逻辑。创建出List<String>集合
String[] split = params.split(",");
list = Arrays.asList(split);
}
public List<String> getObject() throws Exception {
return list;
}
public Class<?> getObjectType() {
return List.class;
}
public boolean isSingleton() {
return true;
}
//[dɪˈspəʊzəbl](对象销毁的时候会调用 蒂斯跑则报)DisposableBean 接口的实现方法
public void destroy() throws Exception {
logger.debug("对象销毁...");
}
public String getParams() {
return params;
}
public void setParams(String params) {
this.params = params;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
}
<bean id="myList" class="com.springmvc.common.aspect.MyFactoryBean">
<property name="params" value="1,2,3,4"/>
</bean>
总结
将对象交由Spring管理的方式:
- 使用XML配置文件<bean>标签;
- 在自定义类上使用@Component注解(将自定义对象交由Spring管理)
- 使用FactoryBean<T>灵活的创建出对象,然后使用XML或者@Component注解交由Spring管理。
- 使用@Bean注解(灵活的创建对象,并放入Spring容器中);
注:本质上Spring的IOC(控制反转),包含两步,一是创建出bean,二是将其放入到容器中。
1. xml配置文件的方式,是Spring通过反射机制创建对象,再放入到容器中。对于我们来说,我们发挥的空间不大,必须按照特定的规则注入属性。面对繁杂的对象,或者可灵活(依赖数据库,实时查询)配置的对象,便有些无力了。而FactoryBean<T>可以解决复杂对象创建。通过代码的方式,创建出bean对象(实际上是通过new的方式),然后在通过@Component或者XML配置放入到容器中。
2. @Bean注解,不仅可以在代码中我们手动的创建出bean对象(new),而且可以注入到容器中,可以说是一种更加方便的解决方案!
Spring中BeanFactory和FactoryBean的区别
BeanFactory是一个工厂类,用于管理Bean的一个工厂,在Spring中,所有Bean都是由BeanFactory(也就是IOC容器)来进行管理的。
FactoryBean是一个工厂Bean,创建的bean是getObject方法返回的对象。一般用于创建比较复杂的bean。