鉴于以下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
?
答案 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>