我是春天的新手
我可以理解@Autowiring用于创建对象。我看过一个示例项目和这样的代码
@Autowired
private EmployeeManager employeeManager;
但我可以看到EmployeeManager是一个接口
public interface EmployeeManager {
public void addEmployee(EmployeeEntity employee);
public List<EmployeeEntity> getAllEmployees();
public void deleteEmployee(Integer employeeId);
}
但是在java中我们无法为接口创建一个对象。那么它是如何工作的。轻微混淆
你能解释一下吗?
答案 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代码完成。