Spring @Autowired如何工作
我遇到了@Autowired的例子
public class EmpManager { @Autowired private EmpDao empDao; }
我很好奇empDao如何设置,因为没有setter方法,它是私人的。
Java允许通过作为reflection框架的一部分的AccessibleObject.setAccessible()
方法 ( Field
和Method
从AccessibleObject
inheritance)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框架