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