为什么在这里我们使用@Autowire

时间:2016-06-09 05:35:05

标签: java spring dependency-injection autowired

我遇到了这段代码

   @Singleton
    @Controller
    @Autowire(mode = AutowireMode.BY_NAME)
    @Path("/")
    public class RootResource {
    }

我在田野上见过@Autowire 它表示按类型自动装配,带有此字段的类将获得具有特定类型的bean。

但是在上面的代码中我不确定是谁在使用这个RootResource bean?

这是Spring-jersey Rest项目。

我理解spring会创建RootResource的bean,而Some class将使用这个bean来设置它的属性。 (我看不到这个bean的任何显式配置)

我的问题是,

1)这门课程是谁?

2)这里按名称进行自动装配,我可以将@Autowired替换为@Resource吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下使用@Autowire是指示Spring容器通过使用名称与RootResource中的属性名匹配的bean将依赖项注入RootResource。

这类似于使用XML配置的bean元素的autowire属性。假设RootResource有

@Singleton
@Controller
@Autowire(mode = AutowireMode.BY_NAME)
@Path("/")
public class RootResource{

   private SomeService someService;

   private AnotherService anotherService;

   public void setSomeService(SomeService someService){
      this.someService = someService;
   }

   public void setAnotherService(AnotherService anotherService){
      this.anotherService = anotherService;
   }

 }

容器将尝试查找名为someService和anotherService的bean,并尝试设置相应的属性。请注意,您不需要任何依赖注入属性或字段级别的注释。

您可以使用@Resource / @Autowired来实现同样的目标。但是,在这种情况下,您必须注释字段或setter。如果在容器中找不到依赖关系,注入也将失败

@Singleton     @Controller     @Autowire(mode = AutowireMode.BY_NAME)     @路径(”/”) 公共类RootResource {

   private SomeService someService;

   private AnotherService anotherService;

   @Resource
   public void setSomeService(SomeService someService){
      this.someService = someService;
   }

   @Resource
   public void setAnotherService(AnotherService anotherService){
      this.anotherService = anotherService;
   }

 }

@Resource将使用bean名称并回退到类型匹配,而@Autowired总是使用类型匹配

另请注意@Autowire和@Autowired有不同的行为。 RootResource bean不需要在应用程序上下文中明确配置。它将由组件扫描器自动检测,因为它具有构造型注释,即@Controoler