Spring 关于注入注解的使用简单记录
2017-08-23 16:50
253 查看
spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
(如上内容摘抄至:http://blog.csdn.net/gst6062825/article/details/8765157)
上面结论就是默认情况下,不给注解配置参数的时候:@Autowired根据类型进行注入,而@Resource会先根据名字注入,如果名字找不到的话在根据类型进行注入。
关于@Autowired注解:
一般开发中,我们都会将业务抽象到接口中,然后以后根据业务使用的技术进行具体实现。在实际开发中更是面向接口编程,而一般不面向具体类编程,这样带来的好处大家应该有受益。在这种情况下,如果我们使用@Autowired注解时候就会出现问题:
No qualifying bean of type [cn.edu.neu.service.UserService] is defined: expected single matching bean but found 2: userServiceImpl,userServiceImpl2
这个问题的原因就是:根据类型注入时候发现多个类型而报错,解决方案是:此时需要使用另个注解了,就是@Qualifier(value="userServiceImpl")注解,括号中的是需要注入的bean在Spring容器中的名字,此时就可以注入成功。所以在使用@Autowired注解时候一般情况下需要使用两个注解,开发效率相对而言不高。
接下来看一下@Resource注解的使用:
通过上述描述其实就可以清楚了解@Resource注解的使用,@Resource注解支持类型和名字参数,一个注解就可以很灵活的解决问题。
拓展补充:
@Component注解:对需要加载容器的Bean可以使用该注解,该注解有一个参数是指定Bean存储到容器中的名字,如果不指定此参数的话,名字默认为类的首字母小写的名字。例如:UserServiceImpl默认名字就是userServiceImpl。也可以指定该参数指定一个具体的名字。
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
(如上内容摘抄至:http://blog.csdn.net/gst6062825/article/details/8765157)
上面结论就是默认情况下,不给注解配置参数的时候:@Autowired根据类型进行注入,而@Resource会先根据名字注入,如果名字找不到的话在根据类型进行注入。
关于@Autowired注解:
一般开发中,我们都会将业务抽象到接口中,然后以后根据业务使用的技术进行具体实现。在实际开发中更是面向接口编程,而一般不面向具体类编程,这样带来的好处大家应该有受益。在这种情况下,如果我们使用@Autowired注解时候就会出现问题:
No qualifying bean of type [cn.edu.neu.service.UserService] is defined: expected single matching bean but found 2: userServiceImpl,userServiceImpl2
这个问题的原因就是:根据类型注入时候发现多个类型而报错,解决方案是:此时需要使用另个注解了,就是@Qualifier(value="userServiceImpl")注解,括号中的是需要注入的bean在Spring容器中的名字,此时就可以注入成功。所以在使用@Autowired注解时候一般情况下需要使用两个注解,开发效率相对而言不高。
接下来看一下@Resource注解的使用:
通过上述描述其实就可以清楚了解@Resource注解的使用,@Resource注解支持类型和名字参数,一个注解就可以很灵活的解决问题。
private UserService userService; @Resource(type=cn.edu.neu.service.UserService.class,name="userServiceImpl") public void setUserService(UserService userService) { this.userService = userService; }
拓展补充:
@Component注解:对需要加载容器的Bean可以使用该注解,该注解有一个参数是指定Bean存储到容器中的名字,如果不指定此参数的话,名字默认为类的首字母小写的名字。例如:UserServiceImpl默认名字就是userServiceImpl。也可以指定该参数指定一个具体的名字。
@Component(value="userService") public class UserServiceImpl implements UserService { private UserDao userDao; @Resource public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
相关文章推荐
- 关于使用spring注解注入静态属性
- 关于Spring的@Profile注解的使用记录
- OA中总结:s:select,关于使用modelDriven,项目分层,@Transactional,jspf,各个层上配置注解交给spring管理的方法,简单的OGNL表达式写法
- spring 框架中的依赖注入(IOC--设值注入)--使用注解--的具体实例的简单实现
- 关于Struts在Spring中使用autowired 自动注入的问题
- 关于spring与struts2使用Annotion注解方式的集成
- ASP.NET MVC 中使用Spring.NET实现简单的属性注入
- 使用Spring的autowire为简单Servlet注入
- 关于Struts在Spring中使用autowired 自动注入的问题
- 使用Spring注解注入属性
- 使用Spring注解来注入属性
- 玩转SSH之Spring(一)---关于Srping框架中使用@query注解实现复杂查询
- 使用spring注解,注入sessionFactory类
- 关于spring的BeanFactory在使用注解的注解事项
- spring使用注解注入HibernateTemplate的sessionFactory异常
- Spring依赖注入的简单示例(基于注解配置)
- action控制层,使用spring注解方式注入业务bean报空指向错误
- spring使用注解方式该如何在框架外获取注入?
- 关于使用Spring和hibernate开发web程序的配置说明和简单实例的详细说明
- 关于spring注解试注入的配置问题