Spring @Autowired是如何工作的

时间:2010-08-21 06:51:09

标签: spring dependency-injection autowired

我遇到了@Autowired

的例子
public class EmpManager {
   @Autowired
   private EmpDao empDao;
}

我很好奇empDao如何得到集合,因为没有setter方法而且它是私有的。

4 个答案:

答案 0 :(得分:41)

Java允许关闭字段或方法的访问控制(是的,首先要通过安全检查)来自AccessibleObject.setAccessible() method,它是反射框架的一部分(Field和{ {1}}继承自Method)。一旦可以发现并写入该字段,完成其余部分就非常简单;只是一个Simple Matter Of Programming

答案 1 :(得分:7)

Java允许您通过反射与类的私有成员进行交互。

查看ReflectionTestUtils,这对编写单元测试非常方便。

答案 2 :(得分:4)

不需要任何setter,只需要使用注释@component声明Class EmpDao,以便Spring将其识别为ApplicationContext中包含的组件的一部分......

你有2个解决方案:

  • 在XML文件applicationContext中手动声明bean:

  • 要通过在上下文文件中设置这些行来使用自动检测:

< context:component-scan base-package =“package”/>

<上下文:注解配置/>

AND 使用spring注释声明spring容器将作为组件管理的类

前:

@Component
class EmpDao {...}

AND 通过@Autowired注释其引用:

@Component (or @Controller, or @Service...)
class myClass {

// tells the application context to inject an instance of EmpDao here
@Autowired
EmpDao empDao;


public void useMyDao()
{
    empDao.method();
}
...
}

通过将一个bean的实例放入另一个bean的实例中的所需字段中来实现自动装配。这两个类都应该是bean,即它们应该被定义为存在于应用程序上下文中。

Spring知道bean EmpDao和MyClass的存在,并将自动实例化MyClass中的EmpDao实例

答案 3 :(得分:1)