浅ピ筱 2021-03-02 23:58 采纳率: 0%
浏览 229

@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"/>

  • 写回答

2条回答 默认 最新

  • a1767028198 2021-03-03 10:20
    关注

    使用@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的对象了,他是啥,什么可能都有

    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?