spring框架之AOP-1
来源:互联网 发布:linux关闭22端口 编辑:程序博客网 时间:2024/05/23 02:03
AOP(面向切面编程):代理
代理模式:1.让代理类实现与委托类相同的接口
理想模式:业务层只处理与业务有关的逻辑。
静态代理模式:
静态代理模式需要实现与被代理者相同的接口,为了看起来和对象一致,需要修改ID。(将代理类的ID设置为被代理类的ID)
好处:实现代码的分离,业务层只处理业务,事务代码只处理事务,实现了松耦合。
缺点:事务添加的代码复用性不好。
动态代理:(JDK的)
1.解决解决代码复写的问题,并且继承了静态的所有优点。
缺点:1、所有方法都添加了事务,这样做不合理(查询可以不添加事务,增删改可以添加事务)
2、动态代理的局限性高,不能灵活运用。(仅限于添加事务)
3、要求代理类必须实现委托类的接口
思路:创建一个动态代理,获取被代理类(目标对象)与事务的类,将两个类传入从而获取动态代理的对象。
Public static Object getProxy(final UserService us,final TransactionManager tm){
Object proxy=Proxy.newProxy(us.getClass().getClassLoader(),us.getClass().getInterfaces(),new InvocationHandler(){
Public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
Try{
Tm.begin();//开启事务
Method.invoke(us,args);
Tm.commit()//提交事务
}catch(Exception e){
Tm.Rollback();//事务回滚
}
}
})
}
测试部分:
UserService Service=(UserService)context.getBean(“userService”);
TransactionManager tm=(TransactionManager)context.getBean(“tm”);
Object Proxy=DynamicProxy.getProxy(Service,tm);//得到代理的对象
Proxy.add();
动态代理:(Cglib)
特点:将来生成的代理对象都是目标对象的子类,无论目标对象是否有接口,都能生成代理对象。
【底层实现:1、Enhance enhance=new Enhance()
2、enhance.setInterface(target.getClass().getInterfaces());
3、enhance.setSuperClass(target.getClass())
4、enhance.setCallback(new MethodInterceptor(){
5、});
6、Return enhance.create();】
Spring底层用Cglib和JDK为我们生成代理对象,方法更加的灵活。
AOP
切面(aspect):做额外的操作。
连接点:执行额外操作的方法。
开发步骤:1、导包(5个)
2、修改配置文件的头
!! 3、编写切面和通知!!()
4、在xml中配置aop <aop:config> <aop:pointcut expression=”切入点表达式”></aop:config>
3.1切面的编写【这个过程与动态代理和静态代理的过程十分相似,将连接器引入,在其中执行目标函数,只是切面中不在直接使用被代理的类】
@Component
Public class Aspact{
@Resource
Private TransactionManager tm;
Public void fangfa(ProceedJoinPoint joinPoint){
Try{
tm.Transtart();//开启事务
JoinPoint.proceed();//执行下一个通知(有多个通知时注意),如果没有下一个通知则执行目标函数、(可以看成是嵌套)
tm.Trancommit();//事务提交
}catch(Exception e ){
Tm.rollback();//事务的回滚
}
}
}
在xml中的配置
<aop:config>
<aop:pointcut expression=”within(service.*)”id=”pc”/>//其中within方法是在包含的类中查找类级别的 满足切入点表达式才给你生成代理
<aop:aspact ref=”as”>//其中ref指的是切面的对象名(切面的ID)
<aop:around method=”fangfa” pointcut-ref=”pc” >//其中method指的是使用切面中的方法,pointcut-ref指的是与哪个切入点绑定
<aop:aspact>
</aop:config>
通知的类型:
Aop:before前置通知 在目标方法执行之前要执行的。
AOP:around环绕通知 在目标方法执行之前和执行之后都需要执行的通知
Aop:after-returnning后置通知 在目标方法执行之后再执行的通知
Aop:after-throwing异常通知 当执行目标方法之后,抛出异常在执行异常通知
Aop:after最终通知 最后一定会被执行的通知相当于finally
ProceedingJoinPointer只能是环绕通知使用
其他通知只能使用JoinPoint 而且JoinPoint只能是在参数的第一位
- spring框架之AOP-1
- spring框架之AOP
- Spring框架之-AOP
- spring框架之aop
- spring框架之AOP
- AOP框架之:Spring AOP和AspectJ
- AOP框架之:Spring AOP和AspectJ
- AOP框架之:Spring AOP和AspectJ
- spring框架之AOP-2
- Spring框架之理解AOP
- SSH:Spring框架(spring之AOP)
- Spring框架学习之(四)--AOP
- Spring框架之IOC、AOP详解
- Java后台框架篇--Spring之AOP
- Spring框架之AOP面向切面编程
- Spring学习框架之四(AOP)
- Spring框架之浅析AOP切面编程
- AOP框架之:Spring 2.x AOP和AspectJ
- GNU C 9条扩展语法
- matlab求变换位置
- 实现js的日期
- atitit 业务 触发器原理. 与事件原理 docx
- servlet/springMVC/spring/Tomcat报错:Servlet mapping specifies an unknown servlet, A child container...
- spring框架之AOP-1
- 【操作系统】进程调度实现
- ssh中action方法不执行导致Dbug无法调试
- 约瑟夫问题POJ
- java笔记
- Fragment运行机制源码分析(一)
- spring框架之AOP-2
- 对 MVC架构的理解
- python opencv 安装记录及使用记录