Spring不使用自动装配的构造函数来加载bean

时间:2016-10-27 06:12:30

标签: java spring autowired

我已将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();
    }
}

3 个答案:

答案 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,只需在员工地址

上添加 @Component