@Resource
不用写set和get方法
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
在spring的配置文件中
说明:
- 启动spring容器
- spring容器内部创建了两个对象person和student
- 当spring容器解析到
<context:annotation-config />
启动依赖注入的注解解析器:
- spring容器在容器中查找所有的bean(prerson,student)
- 看哪些bean的属性上面是否有注解
- 如果属性上面有该注解,再次检查是否有name属性
- 如果没有name属性,则会把该注解标注的属性的名称获取到和spring容器中的bean标签中的id做匹配,如果匹配成功,则赋值,如果匹配不成功,则按照类型(即属性类型与xml中class指定的类)进行匹配,如果匹配成功,则赋值,如果匹配不成功,则报错。
- 如果有name属性,则把name属性的值解析出来和spring容器中的id做匹配,如果匹配成功,则赋值,如果匹配不成功,则报错。
- 从上述的步骤可以看出注解的效率比较低,xml的效率比较高,注解书写比较简单,xml书写比较复杂。
@Autowired
按照类型匹配
在默认情况下使用 @Autowired
注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个
required 属性默认是true,表示注入的时候,该bean必须存在,否则就会报错(BeanCreationException 异常)。修改为ffalse后在找不到匹配 Bean 时也不报错。
@Qualifier
按照ID匹配,注解只能应用于引用类型
@Transactional 注解
说明
1、作用范围
1)方法:推荐将注解使用于方法上,不过需要注意的是:该注解只能应用到 public 方法上,否则不生效。
2)类:如果这个注解使用在类上的话,表明该注解对该类中所有的 public 方法都生效。
3)接口 :不推荐在接口上使用。
@Transactional 的常用配置参数:
原理
@Transactional 的工作机制是基于 AOP 实现的,AOP 又是使用动态代理实现的。如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理,如果目标对象没有实现了接口,会使用 CGLIB 动态代理。
如果一个类或者一个类中的 public 方法上被标注@Transactional 注解的话,Spring 容器就会在启动的时候为其创建一个代理类,在调用被@Transactional 注解的 public 方法的时候,实际调用的是,TransactionInterceptor 类中的 invoke()方法。这个方法的作用就是在目标方法之前开启事务,方法执行过程中如果遇到异常的时候回滚事务,方法调用完成之后提交事务。
事务失效情况