我遇到了这段代码
@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吗?
答案 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