@Autowired与@Resource在实现对象注入时的区别
作者:窦业童
简述
- @Autowired 是来⾃于 Spring的注解,⽽ @Resource 来⾃于 JDK 的注解;
2.@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注 ⼊和属性注⼊,不能⽤于构造函数注⼊
3.使用时设置的参数不同: @Resource 比@Autowired 支持更多的参数设置,例如 name 设置,根据名称获取 Bean。下面详细介绍
详解
相同点1:属性注入(Field Injection)
@Autowried
@Autowired//自动装配 private UserService userService;
@Resource
@Resource private UserService userService;
常见面试题:
注入属性的优缺点:
优点:使用简单方便
缺点:
1.功能缺陷:不能注入一个不可变的对象(final对象)
为什么不能注入一个final修饰的变量呢?\color{green}{为什么不能注入一个final修饰的变量呢?}为什么不能注入一个final修饰的变量呢?
因为Spring也要遵循Java的规范,final修饰的变量必须满足1.使用时直接赋值,或者:2.构造方法赋值
2.通用性问题:只适用于IOC框架(容器)
3设计原则问题,因为属性注入简单方便,所以开发者很容易就违背了单一设计原则。
相同点2:setter注入
//2. setter 注入(Setter Injection) private UserService userService; @Autowired public void setUserService(UserService userService){ this.userService = userService; }
//使用Resource实现setter注入 private UserService userService; @Resource public void setUserService(UserService userService){ this.userService = userService; }
setter注入的优点:符合单一设计原则(一个setter只针对一个对象)
缺点:
- 和属性注入一样,不能注入一个不可变的对象(final对象)
- 因为setter可以被调用多次,注入对象可以被修改,存在被篡改的可能
不同点1:@Autowried可以使用构造方法注入,而@Resource不支持构造方法注入
@Autowried
//3. 构造方法注入(constructor Injection) private UserService userService; //当当前类里面只有一个构造方法的时候,@Autowired 可以省略,当存在多个构造方法时Autowired不能省略 //可以在一个构造方法中注入多个对象,@Autowired也是可以省略的 private UserComponent userComponent; @Autowired public UserController(UserService userService, UserComponent userComponent){ this.userService=userService; this.userComponent = userComponent; }
注意:
1.setter注入和构造方法注入@Autowried是添加在方法上面的
2.当当前类里面只有一个构造方法的时候,@Autowired 可以省略,当存在多个构造方法时,@Autowired不能省略
3.可以在一个构造方法中注入多个对象,如果当前类里面只有一个构造方法的时候,@Autowired也是可以省略的
4.在Spring中,一个类中可以有多个构造方法,但是只能有一个构造方法前面加了@Autowried,否则报错,加了@Autowried的构造方法才会被执行。
构造方法注入优点:
能注入一个final修饰的属性,因为在构造方法中赋值了
因为构造方法在对象创建时就会执行一次,因此他不存在对象会被随时(调用)修改的情况,所以注入对象不会被修改
因为构造方法是在类创建之初就会执行的方法,依赖是在类的构造方法中的,所以依赖在对象使用前就会被完全初始化。
通用性更好,因为构造方法是Java(JDK)支持的(最底层的框架)
@Resource不支持构造方法注入\color{red}{@Resource不支持构造方法注入}@Resource不支持构造方法注入
不同点2:
出身不同,@Autowried是来自Spring的注解,@Resource是来自jdk的注解
不同点3:@Resource支持的参数比@Autowried
@Resource支持的参数
@Autowried支持的参数
举参数name的例子来说明 当Spring中有多个@Bean注解,叫User的对象,
如果直接用
@Autowired//自动装配 private User user;
则会报错
Spring为了解决这个问题推出了以下方法:
@Autowired @Qualifier(value = "UserBeans_user1") private User user;
而使用@Resource,可以直接地区Spring中称为UserBeans_user1的对象,复制到当前类的user上
@Resource(name = "UserBeans_user1") private User user;
以上就是@Autowired与@Resource在实现对象注入时的区别的详细内容,更多关于@Autowired与@Resource区别的资料请关注脚本之家其它相关文章!