Spring对象创建和@autowiring注释

时间:2017-04-21 09:03:37

标签: java spring autowired

我是春天的新手

我可以理解@Autowiring用于创建对象。我看过一个示例项目和这样的代码

@Autowired
private EmployeeManager employeeManager;

但我可以看到EmployeeManager是一个接口

public interface EmployeeManager {
    public void addEmployee(EmployeeEntity employee);
    public List<EmployeeEntity> getAllEmployees();
    public void deleteEmployee(Integer employeeId);
}

但是在java中我们无法为接口创建一个对象。那么它是如何工作的。轻微混淆

你能解释一下吗?

2 个答案:

答案 0 :(得分:2)

您需要为该类提供实现。让我们说EmployeeManagerImpl。所以当spring找到声明时,

@Autowired
private EmployeeManager employeeManager;

它查看spring上下文,看看你是否定义了任何类型为EmployeeManager的bean(具体类型)。如果它只找到该类型的一个bean,它将获取该bean并将其放在属性employeeManager中。

当我们说定义bean时,有两种方法可以做到这一点。

xml方式,

<bean class = "org.sample.EmployeeManagerImpl />

或注释方式

@Component
public class EmployeeManagerImpl {
}

在app启动期间,spring会查找所有xml文件并扫描@Component注释的所有类,创建bean并将它们存储在spring上下文中。作为启动的一部分,当它遇到一个具有Autowired注释的类(顺便说一句应该是bean)时,它会尝试将一个bean(它只是一个类的实例)注入此属性。

答案 1 :(得分:1)

当你@Autowire任何接口时,spring会搜索与自动装配接口映射的bean,并相应地实例化(creates a singleton instance)具体的类/实现。这些bean在servlet-config中定义,无论是通过XML还是Java代码完成。