Spring 中的 Autowired Annotation

时间:2020-02-23 14:36:09  来源:igfitidea点击:

@Autowired注解是实现依赖注入的一种相对较新的风格,它允许我们将其他bean注入另一个所需的bean中。与@Required注释类似,@Autowired注释可用于setter方法以及构造函数和属性上的“autowire”bean。。

@Setter方法的Autowired注释

请注意,在setter方法上使用@Autowired注释时,它会自动获取驻留在XML配置文件中的*<property>*元素的rid。相反,当Spring发现一个使用@Autowired注释的setter方法时,它会对该特定方法执行一个 byType“autowiring”。

让我们来练习一下。更具体地说,@Autowired在setter方法上。

示例服务.java

public class ExampleService {
  private Employee employee;

  @Autowired
  public void setEmployee(Employee emp) {
      //setting the employee
      employee = emp;
  }
}

故障

上面的例子没有什么特别之处。我们只有一个名为 ExampleService的服务类,它有一个类型为 Employee的实例变量,并且有一个名为 setEmployee(Employee emp)的setter方法,它只将Employee设置为任何作为参数的值。

由于@Autowired注释,在实例化ExampleService时,Employee的一个实例作为参数被注入到该方法中。

@构造器自动连线注解

public class ExampleService {
  private Employee employee;

  @Autowired
  public ExampleService(Employee employee) {
      this.employee = employee;
  }

   @Autowired
   public void setEmployee(Employee emp) {
       //setting the employee
       employee = emp;
   }
}

再一次,由于@Autowired注释,Employee的一个实例在实例化ExampleService时被注入构造函数作为参数。

@Autowired属性注释

自动布线特性节省了我们的时间和代码行。怎样?当我们在属性上使用那个注释时,这些属性不再需要getter和setter。很酷吧?

public class ExampleService {
  @Autowired
  private Employee employee;

   @Autowired
   public ExampleService(Employee employee) {
       this.employee = employee;
   }

   @Autowired
   public void setEmployee(Employee emp) {
       //setting the employee
       employee = emp;
   }
}

在上面的代码片段中,我们自动连接了名为 employee的属性。因此,它不再需要setter和getter方法。* employee*在ExampleService创建时被Spring注入。

可选依赖关系

@自动连线也可以是可选的。是这样的:

public class ExampleService {
  @Autowired(required = false)
  private Employee employee;

   @Autowired
   public ExampleService(Employee employee) {
       this.employee = employee;
   }

   @Autowired
   public void setEmployee(Employee emp) {
       //setting the employee
       employee = emp;
   }
}

required=false使其不是必需的依赖项。

我们需要可选依赖项的原因是,Spring希望在构建依赖bean时,@Autowired的依赖项是可用的。否则,它将抛出一个错误。多亏了 required=false,我们解决了这个问题。