Spring源码(3)FactoryBean

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;
    }
}


​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值