Spring @Autowired如何工作

我遇到了@Autowired的例子

public class EmpManager { @Autowired private EmpDao empDao; } 

我很好奇empDao如何设置,因为没有setter方法,它是私人的。

Java允许通过作为reflection框架的一部分的AccessibleObject.setAccessible()方法 ( FieldMethodAccessibleObjectinheritance)closures字段或方法的访问控制(是的,有安全检查先传递)。 一旦这个领域可以被发现和写入,其余的都是非常简单的; 只是一个简单的编程问题 。

Java允许你通过reflection与一个类的私有成员进行交互。

查看ReflectionTestUtils ,这对编写unit testing非常方便。

不需要任何setter,你只需要用注解@component声明Class EmpDao,以便Spring将它标识为包含在ApplicationContext中的组件的一部分。

你有两个解决scheme:

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

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

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

<context:annotation-config />

并且使用spring注释来声明你的spring容器将作为组件pipe理的类

例如:

 @Component class EmpDao {...} 

通过@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(); } ... } 

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

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

Spring使用CGLib API来提供自动assembly的dependency injection。


参考

  • Rod Johnson使用CGLib论坛评论
  • 3.3.1。 注入依赖关系
  • Pro Spring – 分析Spring的依赖关系

进一步阅读

  • Rod Johnson 介绍了Spring框架