【问题标题】:How to Autowire a 1-arg Object Constructor with Previously Autowired Object?如何使用以前自动装配的对象自动装配 1-arg 对象构造函数?
【发布时间】:2014-10-08 20:31:03
【问题描述】:

鉴于以下MyConstructorClass

@Component
public class MyConstructorClass{

  MyObj var;
  public MyConstructorClass( MyObj constrArg ){
    this.var = var;
  }
...
}

如何自动装配需要来自先前 @Autowired 字段的构造函数参数的字段?下面是一个例子。

注意 - 我相信,这个问题与 one 类似,只是我的构造函数参数是 not 字符串。此代码示例根据此问题稍作修改。

@Service
public class MyBeanService{

  @Autowired               
  CustomObject customObj;                // no arguments to constructor

  @Autowired
  MyConstructorClass myConstructorClass; // requires `customObj` as an argument

  ....
}

如何修改MyBeanService 以正确构造myConstructorClasscustomObj

【问题讨论】:

    标签: java spring autowired


    【解决方案1】:

    你可以在你的servlet中使用<constructor-arg>

    <bean id="myConstructorClass" class="package.MyConstructorClass">
            <constructor-arg>
                <bean class="package.CustomObject"/>
            </constructor-arg>
        </bean>
    

    【讨论】:

      【解决方案2】:

      如果这是您需要使用该类的唯一地方,则可以使用 @PostConstruct 实例化自身。我认为有更好的解决方案,但这不是我的想法。

      @Service
      public class MyBeanService{
      
        @Autowired               
        CustomObject customObj;
      
        MyConstructorClass myConstructorClass;      
      
        @PostConstruct
        public void construct()
        {
          myConstructorClass = new MyConstructorClass(customObj);
        }
      }
      

      【讨论】:

      • 所以,MyConstructorClass,在这种情况下,不需要是 Spring 管理的 bean,对吗?
      • 是的,如果您对共享 MyConstructorClass 实例完全不感兴趣并且依赖项很简单,您可以这样做,但 Ricardo Veguilla 提供的答案在未来会更好、更灵活。
      【解决方案3】:

      在构造函数中,可以引用Spring中定义的其他bean。

      <bean id="myConstructorClass" class="package.MyConstructorClass">
          <constructor-arg index="0" ref="customObj"/>
      </bean>
      

      【讨论】:

        【解决方案4】:

        你只需要在 MyConstructorClass 的构造函数上注解@Autowired

        @Component
        public class MyConstructorClass {
            final private CustomObject customObj;
        
            @Autowired 
            public MyConstructorClass(CustomObject customObj) {
                this.customObj = customObj;
            }
        }
        

        另一种选择(不向 MyConstructorClass 添加 @Autowired 构造函数)是使用 @Configuration bean:

        @Configuration
        public class MyConfiguration {         
        
             @Bean 
             public CustomObject customObj() {
                return customObj;
             }
        
             @Bean 
             public MyConstructorClass myConstructorClass() {
                return new MyConstructorClass(customObj());
             }
        
             @Bean
             public MyBeanService myBeanService() {
                 return new MyBeanService();
             }
         }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-01
          • 1970-01-01
          • 2018-07-05
          • 2014-12-17
          • 1970-01-01
          • 2013-06-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多