我已将Address
bean自动装入Employee
bean的构造函数中。并且期望在获取Employee
bean的实例时,我应该在其中获得Address
的实例。但Spring容器使用Employee
的no-args构造函数来返回实例。以下是我的代码
public class Address {
public void print(){
System.out.println("inside address");
}
}
public class Employee {
private Address address;
@Autowired
public Employee(Address address){
this.address = address;
}
public Employee(){}
public Address getAddress(){
return address;
}
}
@Configuration
@ComponentScan(basePackages={"com.spring"})
public class ApplicationConfig {
@Bean
public Employee employee(){
return new Employee();
}
@Bean
public Address address(){
return new Address();
}
}
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
Employee employee = (Employee)context.getBean("employee");
// Here add is null !!
Address add = employee.getAddress();
}
}
答案 0 :(得分:2)
正在使用no-arg构造函数,因为它是您正在调用的那个(new Employee()
):
@Bean
public Employee employee() {
return new Employee();
}
由于您手动创建Employee
实例,而不是让Spring为您创建,您还必须自己传递Address
:
@Bean
public Employee employee() {
return new Employee(address());
}
请注意,对address()
的多次调用实际上是return the same bean,而不是多个新实例,如果您担心的话。
否则,替代方法是使用Employee
注释@Component
,之后Spring将自动为您创建bean并连接Address
依赖项。您可以免费获得该功能,因为您已打开组件扫描(假设您Employee
位于您正在扫描的包中)。如果你走这条路,你可以从配置类中删除employee()
bean定义,否则最终可能会覆盖另一个。
答案 1 :(得分:0)
@Component
public class Employee{
...
}
这应该有用。
答案 2 :(得分:0)
如果你使用spring mvc项目,你必须在 applicationContext.xml 中启用注释,你必须添加这个注释<context:annotation-config>
然后你可以使用 @Autowired ,如果您只使用spring Ioc,只需在员工和地址类