【发布时间】:2011-04-01 23:44:05
【问题描述】:
我遇到了@Autowired的例子:
public class EmpManager {
@Autowired
private EmpDao empDao;
}
我很好奇 empDao 是如何获取集合的,因为没有 setter 方法并且它是私有的。
【问题讨论】:
标签: spring dependency-injection autowired
我遇到了@Autowired的例子:
public class EmpManager {
@Autowired
private EmpDao empDao;
}
我很好奇 empDao 是如何获取集合的,因为没有 setter 方法并且它是私有的。
【问题讨论】:
标签: spring dependency-injection autowired
Java 允许通过 AccessibleObject.setAccessible() method 关闭字段或方法的访问控制(是的,首先要通过安全检查),这是反射框架的一部分(Field 和 Method 都继承自AccessibleObject)。一旦可以发现并写入该字段,剩下的就很简单了;只是一个Simple Matter Of Programming。
【讨论】:
Java 允许您通过反射与类的私有成员进行交互。
查看ReflectionTestUtils,这对于编写单元测试非常方便。
【讨论】:
不需要任何设置器,您只需使用注释 @component 声明 EmpDao 类,以便 Spring 将其识别为 ApplicationContext 中包含的组件的一部分...
你有两个解决方案:
<bean class="package.EmpDao" />
<context:component-scan base-package="package" />
<context:annotation-config />
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 知道 EmpDao 和 MyClass bean 的存在,并会在 MyClass 中自动实例化 EmpDao 的实例。
【讨论】:
Spring 使用CGLib API 提供自动装配的依赖注入。
【讨论】: