AOP面向切面编程(实现不修改原有java代码前提下,就实现额外(增强)功能)
处理各层公共功能:日志管理,事务管理,权限管理
若目标对象实现了若干接口,使用jdk代理
若目标对象没有实现任何接口,使用cglib代理
- aop 配置
- aop 切面:控制哪一层,ref由那个事务管理器处理
- aop 切入点:控制那个包,那个类,那些方法,那些返回值
- 如果包里面写…表示当前包和子包
- 通知包含:前置begin,后置commint,最终close,异常rollback
- 如果四种通知需要一起使用,try catch finally,那必须使用环绕通知 around
<!-- 真实主题角色 -->
<bean id="userService" class="cn.itsource.spring.day2.i_aop_xml.UserServiceImpl" />
<!-- 事务管理器 -->
<bean id="txManager" class="cn.itsource.spring.day2.i_aop_xml.TxManager" />
<!-- aop配置 -->
<aop:config>
<!-- aop切面 :控制那一层,ref由那个事务管理器处理 -->
<aop:aspect ref="txManager">
<!-- aop切入点:控制那个包,那个类,哪些方法,哪些返回值 -->
<!-- expression表达式="execution执行(*返回值 包.类.方法(形参)) -->
<!-- 如果在包里面写..表示当前包和子包,*通配符,形参..所有形式的参数 -->
<aop:pointcut
expression="execution(* cn.itsource.spring.day2.i_aop_xml.I*Service.*(..))"
id="pointcutId" />
<!-- 前置增强/通知 -->
<!-- <aop:before method="begin" pointcut-ref="pointcutId" /> -->
<!-- 后置增强/通知 -->
<!-- <aop:after method="commit" pointcut-ref="pointcutId" /> -->
<!-- 最终增强/通知 -->
<!-- <aop:after-returning method="close" pointcut-ref="pointcutId" /> -->
<!-- 异常增强/通知 -->
<!-- public void rollback(Exception e) throwing="必须和方法里面形参的名称一致" -->
<!-- <aop:after-throwing method="rollback" throwing="e" -->
<!-- pointcut-ref="pointcutId" /> -->
<!-- 如果上面4种增强,需要一起使用try,catch,finally,那就必须使用环绕增强/通知 -->
<aop:around method="around" pointcut-ref="pointcutId" />
</aop:aspect>