FactoryBean在ioc容器的基础上加上了简单的工厂模式和装饰器模式;
为什么需要FactoryBean:这是Spring提供的一个bean,在遇到一些配置比较复杂的bean,使用xml文件配置起来会比较麻烦,这时候可以采用编程的方式来配置。此时会在ioc容器中生成两个bean(一个是id为$user,一个id为是user);
具体的例子:
前提:bean是对象,而bean不一定是对象(右spring管理(创建)的对象才可以成为bean),只有bean对象才可以被ioc容器管理,在需要依赖注入时才可以被注入;
我们在整合spring-mybatis框架时,dao接口(Mapoer对象)的代理对象是由mybatis框架创建的。而此时的代理对象并不在spring框架的ioc容器中,所以我们无法使用到这个代理对象;
FactoryBean就是为了解决这个问题存在,我们可以在FactoryBean这个接口的方法中获取到这个代理对象。然后把这个代理对象返回给ioc容器。这就完成了整合Spring-Mybatis框架;
#把一个创建好的对象放入ioc容器的三种方法
1.使用BeanFactory注册到ioc容器
BeanFactory.registerSingleton("user" , new User());
2.使用@Bean
@Bean
public void user(){
new User();
}
3.FactoryBean
@Component
//实现FactoryBean接口,重写getObject()
//放回一个id为“&user”的User对象到ioc容器中
public class User implements FactoryBean {
@Override
public Object getObject() throws Exception {
Text text = new Text();
//返回一个id为“user”的Text对象到ioc容器中
return text;
}
}
4.使用@import({user.class})导入类
原理:spring去扫描到配置类看到@import注解有需要导入的类,spring会根据类创建BeanDefinition-->--->后面的方法一样生成一个bean对象;
@Import({TextImport.class})
public class Config {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
//可以从ioc容器中拿到TextImport这个类
TextImport ti = applicationContext.getBean(TextImport.class);
}
//另外一个类
//这个类没有添加任何其他的注解
public class TextImport {
}
装饰器模式(解决不同搭配时,类爆炸的问题)
修饰着解决的问题后:
简单工厂模式:利用多态,根据传入不同的需求,创建不同的子类,返回的是父类的引用;
如何使用FactoryBean:
@Component
//实现FactoryBean接口,重写getObject()
//放回一个$Bean01对象到ioc容器中
public class Bean01 implements FactoryBean {
@Override
public Object getObject() throws Exception {
Text text = new Text();
//返回一个text对象到ioc容器中
return text;
}
}