Spring XML中factory-bean配置转@Bean注解的正确实现方式
factory-bean 配置的核心含义
Spring XML中factory-bean和factory-method搭配使用时,代表当前bean不会通过直接调用类构造方法实例化,而是通过调用容器中已存在的指定bean的实例方法来生成:
- 你这段配置里的
proxyConfigbean,不会直接newProxyConfig对象 - Spring会先找到容器中id为
proxyConfigSupport的ProxyConfigSpringXmlSupport实例 - 调用该实例的无参
create()方法,将方法的返回值作为proxyConfigbean注册到容器中
你之前写的proxyConfig实现错误点在于手动new了空的ProxyConfig对象,完全没有复用proxyConfigSupport已经配置好的属性,和原XML逻辑不等价。
对应@Bean配置的正确写法
你之前编写的proxyConfigSupport对应的@Bean方法逻辑是正确的,只需要修正proxyConfig的实现即可,正确代码如下:
@Bean(name = "proxyConfigSupport") public ProxyConfigSpringXmlSupport proxyDataSource(ChainListener queryListener) { ProxyConfigSpringXmlSupport proxyConfigSpringXmlSupport = new ProxyConfigSpringXmlSupport(); proxyConfigSpringXmlSupport.setDataSourceName("dataSourceDefaultName"); proxyConfigSpringXmlSupport.setQueryListener(queryListener); return proxyConfigSpringXmlSupport; } @Bean(name = "proxyConfig") public ProxyConfig proxyConfig(ProxyConfigSpringXmlSupport proxyConfigSupport) { // 直接调用注入的support实例的create方法,和XML factory-bean逻辑完全一致 return proxyConfigSupport.create(); }
代码说明:
- 方法入参
ProxyConfigSpringXmlSupport proxyConfigSupport会由Spring自动注入容器中已经初始化完成的proxyConfigSupportbean,和XML中factory-bean的引用目标完全一致 - 不需要手动创建ProxyConfig实例,
create()方法内部会基于你之前设置的数据源名称、查询监听器等属性生成配置完成的ProxyConfig对象,和原XML的执行效果完全等价。
内容的提问来源于stack exchange,提问作者Hard Worker
相关产品推荐
相关产品推荐

