Java Spring不使用自动连接构造函数来加载bean
我已经将Java Spring不使用自动连接构造函数来加载bean,java,spring,autowired,Java,Spring,Autowired,我已经将Addressbean自动连接到Employeebean的构造函数中。当获取Employeebean的实例时,我应该在其中获取Address的实例。但是Spring容器没有使用Employee的args构造函数来返回实例。下面是我的代码 public class Address { public void print(){ System.out.println("inside address"); } } public class Employee {
Address
bean自动连接到Employee
bean的构造函数中。当获取Employee
bean的实例时,我应该在其中获取Address
的实例。但是Spring容器没有使用Employee
的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();
}
}
@组件
公营雇员{
...
}
这应该可以工作。正在使用无参数构造函数,因为您正在调用该构造函数(
new Employee()
):
由于您是手动创建Employee
实例,而不是让Spring为您创建它,因此您还必须自己传入地址
:
@Bean
public Employee employee() {
return new Employee(address());
}
请注意,如果这是您关心的问题,那么对address()
的多个调用实际上会导致错误,而不是多个新实例
否则,另一种选择是用
@Component
注释Employee
,之后Spring将自动为您创建bean并连接地址
依赖项。您可以免费获得,因为您已经打开了组件扫描(假设您正在扫描的软件包中有Employee
)。如果按照此方法,可以从配置类中删除employee()
bean定义,否则,一个注释可能会覆盖另一个注释。如果您使用spring mvc项目,您必须在应用程序context.xml中启用注释,您必须添加此注释
,然后您可以使用@Autowired,如果您只是使用spring Ioc,只需在员工上添加@组件,地址类@自动连线应放在“专用地址”上@FeiyuZhou,但我想通过构造函数注入bean。这并不奇怪,因为您正在配置文件中使用@bean注释注册bean,并在其中使用无参数构造函数返回new Employe()。还没有尝试过,但我想他还可以在方法签名中添加地址参数:@bean Employee Employee(Address){返回新员工(地址);}@pzeszko是的,我认为这也行,尽管我没有立即看到任何相关文档。
@Bean
public Employee employee() {
return new Employee(address());
}