网站开发 只要,wordpress滑动注册,建站免费加盟,手动删除wordpress插件1.相同点
Resource和Autowired这两个注解的作用都是在Spring生态里面去实现Bean的依赖注入
2.不同点
2.1 Autowired
首先#xff0c;Autowired是Spring里面提供的一个注解#xff0c;默认是根据类型来实现Bean的依赖注入。 Autowired注解里面有一个required属性默认值是t…1.相同点
Resource和Autowired这两个注解的作用都是在Spring生态里面去实现Bean的依赖注入
2.不同点
2.1 Autowired
首先Autowired是Spring里面提供的一个注解默认是根据类型来实现Bean的依赖注入。 Autowired注解里面有一个required属性默认值是true表示强制要求bean实例的注入在应用启动的时候如果IOC容器里面不存在对应类型的Bean就会报错。当然如果不希望自动注入可以把这个属性设置成false。
Controller
public class HelloController {Autowired(required true)private HelloService helloService;ResponseBodyRequestMapping(/hello)public String hello() {return helloService.hello();}
}但是当项目有多个相同类型的Bean被定义时使用Autowired会报错
org.springframework.context.annotation.Configuration
public class Configuration {Bean(hello1)public HelloService hello1() {return new HelloServiceImpl();}Bean(hello2)public HelloService hello2() {return new HelloServiceImpl();}
}所以Spring启动的时候会提示一个错误大概意思原本只能注入一个单实例Bean但是在IOC容器里面却发现有多个导致注入失败。
Field helloService in com.zte.helloworld.contorller.HelloController required a single bean, but 3 were found:- helloServiceImpl: defined in file [D:\JavaWorkSpace\code\helloworld\target\classes\com\zte\helloworld\service\impl\HelloServiceImpl.class]- hello1: defined by method hello1 in class path resource [com/zte/helloworld/config/Configuration.class]- hello2: defined by method hello2 in class path resource [com/zte/helloworld/config/Configuration.class]Action:
Consider marking one of the beans as Primary, updating the consumer to accept multiple beans, or using Qualifier to identify the bean that should be consumed
针对这个问题我们可以使用 Primary或者Qualifier这两个注解来解决。 Primary表示主要的bean当存在多个相同类型的Bean的时候优先使用声明了Primary的Bean。 Qualifier的作用类似于条件筛选它可以根据Bean的名字找到需要装配的目标Bean。
Controller
public class HelloController {Autowired(required true)Qualifier(hello1)private HelloService helloService;ResponseBodyRequestMapping(/hello)public String hello() {return helloService.hello();}
}2.2 Resource
Resource是JDK提供的注解只是Spring在实现上提供了这个注解的功能支持。 它的使用方式和Autowired完全相同最大的差异于Resource可以支持ByName和ByType两种注入方式。 如果使用nameSpring就根据bean的名字进行依赖注入如果使用typeSpring就根据类型实现依赖注入。 如果两个属性都没配置就先根据定义的属性名字去匹配如果没匹配成功再根据类型匹配。两个都没匹配到就报错。
Controller
public class HelloController {// Autowired(required true)
// Qualifier(hello1)
// private HelloService helloService;Resource(name helloService01)private HelloService01 helloService01;Resource(type HelloService02.class)private HelloService02 helloService02;ResponseBodyRequestMapping(/hello)public String hello() {return helloService02.hello();}
}3.总结
Autowired是根据type来匹配Resource可以根据name和type来匹配默认是name匹配。Autowired是Spring定义的注解Resource是JSR 250规范里面定义的注解而Spring对JSR 250规范提供了支持。Autowired如果需要支持name匹配就需要配合Primary或者Qualifier来实现。