如何使用以前自动对象的自动装配1-arg对象构造函数?

时间:2014-08-15 03:12:50

标签: java spring autowired

鉴于以下MyConstructorClass

@Component
public class MyConstructorClass{

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

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

注意 - 我相信这个问题类似于这个one,除了我的构造函数参数是一个String。此代码示例稍微修改了此问题。

@Service
public class MyBeanService{

  @Autowired               
  CustomObject customObj;                // no arguments to constructor

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

  ....
}

如何修改MyBeanService以使用myConstructorClass正确构建customObj

4 个答案:

答案 0 :(得分:2)

您只需要使用@Autowired注释MyConstructorClass的构造函数:

@Component
public class MyConstructorClass {
    final private CustomObject customObj;

    @Autowired 
    public MyConstructorClass(CustomObject customObj) {
        this.customObj = customObj;
    }
}

另一种选择(不将@Autowired构造函数添加到MyConstructorClass)是使用@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();
     }
 }

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果这是您需要使用的唯一地方,那么该类可以使用@PostConstruct来实例化它自己。我认为有一个更好的解决方案,但这不是我的首要任务。

@Service
public class MyBeanService{

  @Autowired               
  CustomObject customObj;

  MyConstructorClass myConstructorClass;      

  @PostConstruct
  public void construct()
  {
    myConstructorClass = new MyConstructorClass(customObj);
  }
}

答案 3 :(得分:0)

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

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