@Configuration和FactoryBean在用途上有没有什么区别?

感觉它们都是用来注入一个复杂的bean,复杂的bean就是不能直接new出来的对象(要通过工厂创建或者是要通过反射生成,等等)

比如注入一个德鲁伊的数据源,可以这样写:

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        Properties properties = new Properties();
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("druid.properties");
        try {
            properties.load(is);
            return DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

也可以这样写:

public class DataSourceFactoryBean implements FactoryBean<DataSource> {

    @Override
    public DataSource getObject() throws Exception {
        Properties properties = new Properties();
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("druid.properties");
        try {
            properties.load(is);
            return DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public Class<?> getObjectType() {
        return DataSource.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

然后在spring的配置文件中加上<bean id="dataSourceFactoryBean" class="com.dwb.config.DataSourceFactoryBean"/>

使用@Bean注入和factorybean注入,创建对象时,spring单独处理了factorybean,说明还是有区别的;

factorybean最大的亮点,还是在getObject这块,像mybatis,feign,我们在用的时候,注入的bean他都是一个接口,它注入到容器总不能也是个接口吧,这玩意能实例化嘛?以mybatis为例,实际上mapper接口注入的时候,类型是MapperFactoryBean,通过getObject,从sqlsession获取mapper,getObject后返回mapper的代理对象;

factorybean的强大就在这里,我注入容器的真实类型是FactoryBean,从容器获取的类型,不一定就是FactoryBean他本身;你用@Bean方式注入的对象,是啥就是啥,不可能说我注入的是DataSource,返回的UserService,但是使用factorybean,他注入的是factorybean,但是返回的是你getobject的对象了,他是啥,什么可能都有

1、把DataSource添加到IOC容器中,不是@Configuration注解,是@Bean注解,把@Configuration换成@component,@bean注解同样生效,只是DataSourceConfig 不会被cglib代理;

2、个人感觉@bean注解和BeanFactory接口没有太大区别,都是提供自定义创建一个bean,BeanFactory是spring早期提供的自定义创建bean的方式,因为@Bean是spring3.x版本才有的。