【问题标题】:Inject bean property from outer bean从外部 bean 注入 bean 属性
【发布时间】:2013-05-27 13:26:39
【问题描述】:

我有以下情况。

我有两个豆子,例如:

<bean id="service1" parent="txProxyTemplate">
   <property name="target">
      <bean autowire="byName" class="Class1"/>
   </property>
</bean>

<bean name="manager1" parent="txProxyServiceTemplate">
   <property name="target">
      <bean autowire="byName" class="ManagerClass1"/
   </property>
</bean>

我还有第三个 bean,它真正注入了这两个 baens:

<bean name="supportBean" parent="txProxyServiceTemplate">
   <property name="target">
      <bean autowire="byName" class="SupportBeanClass">
      </bean>
   </property>
</bean>

bean service1(path = "first path") 和 manager1 (path = "second path") 中有字符串 "path" 字段。 当 supportBean 被注入到 service1 和 manager1 中时,我希望 supportBean 中的一些字符串字段(例如“actualPath”)是从两个封闭的 bean 自动启动的。我怎么能在春天做到这一点?

PS:我需要 service1 和 manager1 具有带有两个不同字段的 supportBean(在 service1 类中 supportBean 有 actualPath = "first path",在 manager1 类中 supportBean 有 actualPath = "second path)

希望你能理解我,谢谢!

【问题讨论】:

    标签: java spring dependency-injection ioc-container


    【解决方案1】:

    在没有看到任何实际代码的情况下,你能不能在封闭 bean 的 setter 中将 actualPath 设置在 SupportBean 上? SupportBean 需要有一个原型范围,以便可以维护单独的状态。

    例如,如果您的 SupportBean 看起来像这样:

    @Component
    @Scope("prototype")
    public class SupportBean {
    
        private String actualPath;
    
        public void setActualPath(String actualPath) {
            this.actualPath = actualPath
        }
    }
    

    然后你可以在封闭bean的setter中设置SupportBean的实际路径。所以Service1 可能看起来像这样:

    @Service
    public class Service1 {
    
        private String path = "first path";
        private SupportBean supportBean;
    
        @Autowired
        public void setSupportBean(SupportBean supportBean) {
            this.supportBean = supportBean;
            this.supportBean.setActualPath(this.path);
        }
    }
    

    Manager1 是这样的:

    @Service
    public class Manager1 {
    
        private String path = "second path";
        private SupportBean supportBean;
    
        @Autowired
        public void setSupportBean(SupportBean supportBean) {
            this.supportBean = supportBean;
            this.supportBean.setActualPath(this.path);
        }
    }
    

    如果您更愿意使用构造函数注入,那么只需删除 setter 并自动装配构造函数:

    @Service
    public class Service1 {
    
        private String path = "first path";
        private SupportBean supportBean;
    
        @Autowired
        public Service1(SupportBean supportBean) {
            this.supportBean = supportBean;
            this.supportBean.setActualPath(this.path);
        }
    }
    

    【讨论】:

    • 这是一个很好的变体,谢谢 :) 但是我怎样才能避免通过 setter 设置“路径”呢?我可以通过构造函数以某种方式做到这一点吗?
    • @Dedyshka - 您可以使用构造函数注入来自动装配服务。如果您的意思是是否可以通过其构造函数在 SupportBean 上设置实际路径 - 这将更加困难,因为 Spring 在自动连接服务时已经创建了 SupportBean。您也许可以创建一个SupportBeanFactory 或类似的并自动装配它。然后,工厂可以创建SupportBean,为SupportBean 的构造函数提供相关路径。这实际上取决于您要实现的目标。
    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 2019-03-03
    • 1970-01-01
    • 2016-12-26
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多