使用Java配置的Spring构造函数注入

时间:2018-11-02 07:14:45

标签: spring dependency-injection

我有一个接受以下构造函数的类

    public Student(int id, String name, Map<String, List<String>> mapInject) {
    super();
    this.id = id;
    this.name = name;
    this.mapInject = mapInject;
}

然后从spring Java Config中,我像下面那样注入构造函数args。

@Configuration
public class JavaConfig {

@Bean
public Employee getEmployeeBean() {

    Map<String,List<String>> mapInject = new HashMap<String,List<String>>();

    //Add map element

    return new Employee(3123,"John",mapInject);
}
}

我在这里进行构造函数注入吗?这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

除非您希望所有员工具有相同的ID和名称,否则我不会使用Spring来处理此bean。

Spring的强大功能是其依赖关系注入(Dependency Injection,DI),您可以在其中为提供程序(例如数据库管理器,服务等)定义bean,并将其注入到组件中。像您一样定义@Bean毫无用处,因为现在您只能注入ID为3123且名称为John的员工。

重要的是要理解,仅仅因为您正在使用Spring,并不意味着一切都需要作为bean处理-您将始终需要标准的POJO来容纳和传递状态(例如Employee类),而这不会不需要和Spring有任何关系。

例如,您可能有一个EmployeeService,其中包含用于从数据库等中获取员工的业务逻辑,然后可以将其配置为Bean,以便将其注入整个应用程序中。

编辑

@Configuration
public class JavaConfig {

    @Bean
    @Autowired //assuming a sessionfactory been is configured elsewhere 
    public EmployeeService employeeService(final SessionFactory sessionfactory) {
        return new EmployeeService(sessionFactory);
    }
}

然后您可以将其注入到任何地方(例如在控制器中):

@RestController
public class EmployeeController {
    private final EmployeeService employeeService;

    @Autowired
    public EmployeeController(final EmployeeService employeeService) {
         this.employeeService = employeeService;
    }
}

在EmployeeController不需要知道或关心userService是否具有数据库连接的情况下,也不需要担心对其进行配置,因为Spring会处理所有这些连接。