Aop
- 通知方法
- 前置通知 (@Before
)
- 后置通知(@After
)
- 返回通知(@AfterReturning
)
- 异常通知(@AfterThrowing
)
- 过程
- 首先建立被代理类和代理类
- 在代理类上标注@Aspect注解,然后在不同的通知方法上标注不同的通知注解
- 例@Before
的参数填写被代理类中的方法引用(方法的权限定名)
- 除了在注解中写方法引用,还可以使用@PointCut
注解,注解参数可以填写execution表达式作为value值,创建一个空方法体的方法,标注@PointCut
,其他通知注解如果想使用这个切点表达式,将@PointCut
标注的方法的方法名作为值填入即可,例@Before("pointCut()")
- execution表达式execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)
,切点表达式中方法入参部分比较复杂,可以使用””和“…”通配符,其中“”表示任意类型的参数,而“…”表示任意类型参数且参数个数不限。
- 如果想在代理类中的代理方法中使用运行是被代理类的信息,可以在代理方法中填写JoinPoint类型的参数,注意一点,如果填写JoinPoint参数,这个参数必须是方法参数列表的第一个.
- 返回通知@AfterReturning
除了可以写value参数,还可以有returning参数,如果标注了returning="result"
参数,可以再方法参数填写Object result
,随后在方法体内可以使用.
- 异常通知@AfterThrowing
除了可以写value参数,还可以有throwing参数,如果标注了throwing="exception"
参数,可以再方法参数填写Exception exception
,如果发生异常,会调用并返回异常信息
AOP原理 (很乱,别看)
- @EnableAspectJAutoProxy
- 注解内部
@Import(AspectJAutoProxyRegistrar.class)
:给容器导入AspectJAutoProxyRegistrar
组件 AspectJAutoProxyRegistrar
组件自定义给容器注入bean,AnnotationAwareAspectJAutoProxyCreator
看一下这个bean的继承树
- 可以看到这个bean在底层实现了
BeanPostProcessor
(Bean创建前后做了什么)和BeanFactoryAware
(如何创建),我们需要搞清楚这两个bean做了什么 - 从Main开始的流程
- 传入配置类,创建ioc容器
- 注册配置类,调用refresh(),刷新容器
registerBeanPostProcessor(beanFactory)
;注册bean的后置处理器BeanPostProcessor
方便拦截bean的创建- 先获取ioc容器已经定义了的需要创建对象的所有BeanPostProcessor
- 给容器中注册别的BeanPostProcessor
- 优先注册实现类
PriorityOrderd
接口的BeanPostProcessor
- 再给容器注册实现了
Ordered
接口的BeanPostProcessor
- 注册没有实现优先级接口的
BeanPostProcessor
- 所谓的注册,就是创建BeanPostProcessor对象,保存在容器中.
- 创建bean的实例
- populateBean 给bean赋值
- 初始化bean
- 处理Aware接口的回调
- 调用初始化前的方法
- 调用初始化方法
- 调用初始化后的方法
BeanPostProcessor
创建成功,
- 把
BeanPostProcessor
注册到BeanFactory
中 - 以上是创建后置处理器的过程,创建BeanPostProcessor的作用是,为以后创建bean提供后置处理器
- 完成BeanFactory的初始化工作,创建剩下的单实例bean
- 遍历容器内的bean,依次创建对象
- 首先getBean从缓存中获取bean,如果存在,就不创建,否则再创建,只要创建好的bean,都会被缓存起来
- 创建bean
- 希望后置处理器能返回一个代理对象,如果不能返回,到下一步
- 真正的创建一个bean实例
- 后置处理器返回代理对象,
- 注解内部
看不懂了,先不写了
Spring 事务
- 配置数据源-配置类中的@Bean
- 创建JdbcTemplate操作数据
- 给需要添加事务的方法标注
@Transactional
表示当前方法是一个事务方法 - 给配置类添加
@EnableTransactionManagement
开启事务管理功能 - 在配置类中添加事务管理器来控制事务@Bean方法返回一个
PlatformTransactionManage
类型对象,一般是DataSourceTransactionManager