aop面向切面编程
aop术语
1.连接点:程序执行中某一特定位置,如:方法的前后
2.切点:定位到相应的连接点
3.增强或者事务:对连接点进行增强
4.目标对象:target,需要拓展的目标类
5.切面:切点和事务组成切面
spring 实现aop的两种方式
1.jdk动态代理:目标对象有接口时用这种方式
2.CGLIB动态代理:目标对象没有接口
标记为final的方法不能够被通知。spring是为目标类产生子类。任何需要 被通知的方法都被复写,将通知织入。final方法是不允许重写的。
xml版aop
1.添加aop命名空间
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
2.事务管理者
public class TxManager {
public void begin(){
System.out.println("开始");
}
public void commit(){
System.out.println("提交");
}
public void close(){
System.out.println("关闭");
}
public Object around(ProceedingJoinPoint joinPoint){
begin();
Object proceed =null;
try {
object = joinPoint.proceed();//目标对象中需要增强的方法
} catch (Throwable throwable) {
throwable.printStackTrace();
}
commit();
close();
}
return object;
}
3.注入txmanager
//注入txmanager
<bean class="com.wal.common.TxManager" id="txManager"/>
<aop:config>
//切点
<aop:pointcut expression="execution(* com.wal.aop.I*Service.*(..))" id="pointcut" />
//切面
<aop:aspect ref="txManager">
//设置环绕通知
<aop:around method="around" pointcut-ref="pointcut" />
</aop:aspect>
</aop:config>
注解版aop
1.配置xml 扫描包txmanager
<!-- 组件搜索 -->
<context:component-scan base-package="com.wal.aopanno" />
<!-- 支持aop注解 -->
<aop:aspectj-autoproxy />
2.txManager配置
@Component
@Aspect //AOP的类注解
public class TxManager {
//设置切点
@Pointcut("execution(* com.wal.aopanno.I*Service.*(..))")
public void pointcut(){}
//切点+事务
@Around("pointcut()")
public Object around(ProceedingJoinPoint joinPoint){
Object object = null;
try {
begin();
object = joinPoint.proceed(); //被增强对象中的方法
commit();
} catch (Throwable e) {
rollback(e);
}finally{
close();
}
return object;
}