52

我遇到了一个例子@Autowired

public class EmpManager {
   @Autowired
   private EmpDao empDao;
}

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

4

4 回答 4

44

Java 允许通过作为反射框架一部分的AccessibleObject.setAccessible()方法Field(和Method继承自)关闭字段或方法的访问控制(是的,首先要通过安全检查AccessibleObject)。一旦可以发现并写入该字段,剩下的就很简单了;仅仅是一个简单的编程问题

于 2010-08-21T16:14:59.313 回答
7

Java 允许您通过反射与类的私有成员进行交互。

查看ReflectionTestUtils,它对于编写单元测试非常方便。

于 2010-08-21T16:03:43.647 回答
4

不需要任何设置器,您只需EmpDao使用注释声明类,@component以便 Spring 将其识别为 ApplicationContext 中包含的组件的一部分...

您有 2 个解决方案:

  • 在 XML 文件 applicationContext 中手动声明您的 bean:
<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自动实例化EmpDaoin的实例MyClass

于 2013-01-28T10:41:22.963 回答
1

Spring 使用CGLib API 来提供自动装配的依赖注入。


参考

延伸阅读

于 2010-08-21T07:01:13.793 回答