SpringMVC学习笔记(四)
文章目录
- SpringMVC学习笔记(四)
- 1.@Autowire注解
- 2.@Resource注解
- 3.@Resource和@Autowire对比
1.@Autowire注解
@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public void save(){
userRepository.save();
}
}
比如:这里需要一个UserRepository类型的属性,通过@Autowired自动装配方式,从IoC容器中去查找到,并返回给该属性。
注意事项:
在使用@Autowired时,首先在容器中查询对应类型的bean
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果查询的结果不止一个,那么@Autowired会根据名称来查找。
如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false
2.@Resource注解
@Resource是做bean的注入时使用,@Resource不是Spring所自带的注解,它的jar包是javax.annotation.Resource,该jar包由J2EE提供, 需要JDK1.6及以上,默认按照byName自动注入。@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入。
@Resource有两个重要的属性:
1.name: Spring将@Resource注解的name属性解析为bean的名字。
2.type: type属性则解析为bean的类型。
注: 如果使用name属性,则使用byName的自动注入策略,而使用type属性则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序:
1.同时指定了name和type的话,先从Spring上下文中找到唯一匹配的bean进行装配,未找到则抛出异常。
2.假如指定了name,就从Spring上下文中查找名称(id或者name)匹配的bean进行装配,未找到则抛出异常。
3.假如指定了type,就从Spring上下文中找到类型匹配的唯一bean进行装配,找不到或找到多个,都抛出异常。
4.如果既没指定name,也没指定type,则自动按照byName方式进行装配。如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
3.@Resource和@Autowire对比
使用区别:
(1)@Autowired与@Resource都可以用来装配bean,都可以写在字段或setter方法上。
(2)@Autowired默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性为false。如果想使用名称装配可以结合@Qualifier注解进行使用。
(3)@Resource,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行名称查找。如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。