您的位置:首页 > 编程语言 > Java开发

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注解支持类型和名字参数,一个注解就可以很灵活的解决问题。

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: