我遇到了一个例子@Autowired
:
public class EmpManager {
@Autowired
private EmpDao empDao;
}
我很好奇empDao
get 是如何设置的,因为没有 setter 方法并且它是私有的。
我遇到了一个例子@Autowired
:
public class EmpManager {
@Autowired
private EmpDao empDao;
}
我很好奇empDao
get 是如何设置的,因为没有 setter 方法并且它是私有的。
Java 允许通过作为反射框架一部分的AccessibleObject.setAccessible()
方法Field
(和Method
继承自)关闭字段或方法的访问控制(是的,首先要通过安全检查AccessibleObject
)。一旦可以发现并写入该字段,剩下的就很简单了;仅仅是一个简单的编程问题。
Java 允许您通过反射与类的私有成员进行交互。
查看ReflectionTestUtils,它对于编写单元测试非常方便。
不需要任何设置器,您只需EmpDao
使用注释声明类,@component
以便 Spring 将其识别为 ApplicationContext 中包含的组件的一部分...
您有 2 个解决方案:
<bean class="package.EmpDao" />
<context:component-scan base-package="package" />
<context:annotation-config />
并使用 spring 注释来声明你的 spring 容器将作为组件管理的类:
@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();
}
...
}
自动装配是通过将一个 bean 的实例放入另一个 bean 实例中的所需字段来实现的。两个类都应该是bean,即它们应该被定义为存在于应用程序上下文中。
Spring 知道 bean 的存在,EmpDao
并将MyClass
自动实例化EmpDao
in的实例MyClass
。