我遇到了@Autowired
的例子public class EmpManager {
@Autowired
private EmpDao empDao;
}
我很好奇empDao如何得到集合,因为没有setter方法而且它是私有的。
答案 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)
Spring使用CGLib API提供自动连接依赖注入。