Spring注解@Autowired如何工作?

发布于 2024-09-15 13:11:57 字数 173 浏览 11 评论 0原文

我遇到了一个 @Autowired 的例子:

public class EmpManager {
   @Autowired
   private EmpDao empDao;
}

我很好奇 empDao 如何获取集合,因为没有 setter 方法而且它是私有的。

I came across an example of @Autowired:

public class EmpManager {
   @Autowired
   private EmpDao empDao;
}

I was curious about how the empDao get sets since there are no setter methods and it is private.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

反目相谮 2024-09-22 13:11:57

Java 允许通过 AccessibleObject.setAccessible() 方法,它是反射框架的一部分(都是 FieldMethod 继承自 AccessibleObject)。一旦可以发现并写入该字段,剩下的事情就变得非常简单;只是一个简单的编程问题

Java allows access controls on a field or method to be turned off (yes, there's a security check to pass first) via the AccessibleObject.setAccessible() method which is part of the reflection framework (both Field and Method inherit from AccessibleObject). Once the field can be discovered and written to, it's pretty trivial to do the rest of it; merely a Simple Matter Of Programming.

浮生面具三千个 2024-09-22 13:11:57

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

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

Java allows you to interact with private members of a class via reflection.

Check out ReflectionTestUtils, which is very handy for writing unit tests.

你如我软肋 2024-09-22 13:11:57

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

您有 2 个解决方案:

  • 在 XML 文件 applicationContext 中手动声明您的 beans:
<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 知道 bean EmpDaoMyClass 的存在,并将在 MyClass 中自动实例化 EmpDao 的实例。

No need for any setter, you just have to declare the EmpDao class with the annotation @component in order that Spring identifies it as part of the components which are contained in the ApplicationContext ...

You have 2 solutions:

  • To manually declare your beans in the XML file applicationContext :
<bean class="package.EmpDao" />
  • To use automatic detection by seeting these lines in your context file:
<context:component-scan base-package="package" />
<context:annotation-config />

AND to use the spring annotation to declare the classes that your spring container will manage as components:

@Component
class EmpDao {...}

AND to annotate its reference by @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();
}
...
}

Autowiring happens by placing an instance of one bean into the desired field in an instance of another bean. Both classes should be beans, i.e. they should be defined to live in the application context.

Spring knows the existence of the beans EmpDao and MyClass and will instantiate automatically an instance of EmpDao in MyClass.

暖阳 2024-09-22 13:11:57

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


参考文献

进一步阅读

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文