问题 @Autowired注释在Java中的好处


也许,因为我的英语错误,我无法理解使用@Autowired注释的好处。

根据教程,我们可以通过@Autowired将第一个(I。)案例简化为第二个案例(II。)。

我的问题是,@ Autowired是什么意思?因为它不再告诉,因为不使用@Autowired,编译器可以根据声明得出“EmpDao emDao”和“EmpManager”密切相关。

代码引自 这里

一世。

    <bean id="empDao" class="EmpDao" />
    <bean id="empManager" class="EmpManager">
       <property name="empDao" ref="empDao" />
    </bean>

public class EmpManager {

   private EmpDao empDao;

   public EmpDao getEmpDao() {
      return empDao;
   }

   public void setEmpDao(EmpDao empDao) {
      this.empDao = empDao;
   }

   ...
}

II。

<context:annotation-config />

<bean id="empManager" class="autowiredexample.EmpManager" />
<bean id="empDao"     class="autowiredexample.EmpDao" />

import org.springframework.beans.factory.annotation.Autowired;

public class EmpManager {

   @Autowired
   private EmpDao empDao;

}

6873
2018-02-14 22:07


起源

我认为我没有比你的例子更清楚地解释它。第二种情况更短,代码混乱更少 - 为什么这本身并不是一件好事? - skaffman
我看到我们可以节省一些线,但我不明白@Autowired的真正好处。如果Spring生成EmpManager的实例,那么同时也会生成EmpDao empDao。无论有没有@Autowired,我们都有empDao - cscsaba
可能重复 了解Spring @Autowired用法 - tkruse


答案:


@Autowired 是特定于春天的。 @Inject 是标准的等价物。它是一个注释,告诉上下文(春天,或在情况下) @Inject  - 任何DI框架)尝试将对象设置到该字段中。

编译器与此无关 - 它是实例化对象的DI框架(spring) 在运行时,然后在您指定的点处设置它们的依赖关系 - 通过XML或通过注释。

我同意DI框架可能会尝试将依赖项注入所有字段,即使它们没有注释。 (如果要排除特定字段,请对其进行注释)。但他们选择了另一种策略(配置超过惯例)。顺便一提:

  • 如果使用xml配置并选择某种形式的自动装配,bean的依赖关系将自动自动装配,而无需指定任何内容
  • 您可以指定每个上下文的自动装配设置。

11
2018-02-14 22:10



我明白了,所以Spring对声明(编译器之类的功能)一无所知,这就是为什么我们必须引导Spring如何关联类。对 ? - cscsaba
@ user303352 spring知道所有关于类的知识,但它不知道你是否 想 它注入或不注入的东西。 - Bozho
但是,如果Spring制作EmpManager的实例,那么它同时也会成为EmpDao empDao。无论有没有@Autowired,我们都有empDao - cscsaba
@ user303352你有它,但你可能不想在那里注入它(我不说这是一个常见的情况)。这可能是假设存在的默认策略 @Autowired,但他们并没有这样选择。 - Bozho
@ user303352实际上你没有EmpDAO的实例,除非你创建一个或让spring创建它并将其添加到EmpManager:使用@Autowired或<property ... ref =“empDao”>。编译器没有给出关于何时想要创建实例的信息,它只知道EmpManager引用了EmpDao,称为empDao - Mauricio


当服务器引导自己时。它找到了

 <context:annotation-config />

在应用程序上下文中,然后遍历上下文中定义的类。如果有任何自动装配的bean,它会通过引用上下文文件将其注入到类中。

基本上,它促进了约定优于配置。这就是大多数框架目前为缩短开发时间所做的工作。


1
2018-02-14 22:13



我对Bozho也有同样的答案:如果Spring制作EmpManager的实例,那么同时也会制作一个EmpDao empDao。无论有没有@Autowired,我们都有empDao - cscsaba
它实例化上下文文件中的所有类,并且由于<context:annotation-config />,它会遍历所有实例化的类以注入依赖项。所以它首先创建,扫描然后注入。 - Vanchinathan Chandrasekaran
也许我不知道实际注入是什么,因为对我来说,当Spring经历并创建例如EmpManager而不是它和empDao时。 empDao在创建EmpManager期间自动创建。 - cscsaba
好的,我将检查约定优于配置或配置的约定。 ? - cscsaba
对不起,浪费你的时间,谢谢你的帮助和努力表明。 - cscsaba


@Autowired Spring注释告诉Spring一个名为'empDao'的bean并将其注入到EmpManager类中,而无需在spring配置文件中添加empDao bean作为属性。


1
2018-02-14 22:13



我有一个像Bozho一样的答案:但是如果Spring制作EmpManager的实例,那么同时也会制作一个EmpDao empDao。无论有没有@Autowired,我们都有empDao - cscsaba
对不起,浪费你的时间,谢谢你的帮助和努力表明。 - cscsaba


@Autowired告诉Spring在该bean中找到声明类型和连线的bean,而不是要求bean名称显式查找。在某些情况下,如果在给定的Spring上下文中只有一个类型的实现,它可以使配置应用程序更容易。


0
2018-02-14 22:12



我看到了差异,但是在不使用@Autowired的情况下,可以从声明中找出所有内容。看到Bozho的评论,他指出我的不相信。声明由编译器解释,注释向Spring通知关系。 - cscsaba
对不起,浪费你的时间,谢谢你的帮助和努力表明。 - cscsaba