1 Spring容器目前所学内容的好处
降低偶合度(Spring容器+面向接口编程)
2 面向AOP切面编程引入
(1) 代理:1代理对象必须和被代理对象有相同的方法。2代理对象除了做被代理者核心业务之外还要做其他额外操作
(2)静态代理:
把事务从service层中提取出来,降低了耦合,易于扩展。
优点:低耦合
缺点:1 静态代理一个代理只能代理一个类
2 一个代理中重复代码太多,不能复用
(3)动态代理:
1 JDK提供
优点:1延续动态代理的优点
2 代码重用,一个动态代理类,可以为多个service生成代理对象
缺点:1必须要求被代理类有接口
2 代理类中的方法是统一添加了事务或者权限控制代码,不容易进行方法的过滤
2 Spring提供的CGLib
优点:1)延续JDK动态代理的优势
2)不需要有接口
缺点:代理类中的方法是统一添加了事务或者权限控制代码,不容易进行方法的过滤
3 Spring框架提供的AOP
切面(Aspect):实际指的是一个类,做特定业务的类(事务切面、权限控制切面、日志等)
连接点(joinpoint):指的是目标类中的各个方法
通知(Advice):切面中的各个方法
切入点(Pointcut):决定是否执行连接点的规则
目标对象(Target Object):被代理的对象
AOP代理:代理对象
织入(Weaving):把切面添加到业务中的一个过程
通知类型:
前置通知,后置通知,环绕通知,异常通知,最终通知
4 SpringAOP实现过程
1)导入jar包
2)创建事务切面类
3)在切面中添加通知方法(也就是事务切面的方法)
例:添加环绕通知(连接点之前之后添加内容,还可以控制连接点是否执行)
public void around(proceedingJoinPoint joinPoint){
开启事务切面方法
执行连接点的代码(即代理类中的方法)
joinPoint.proceed();
提交事务切面的方法
}
4)创建连接点(目标类中创建)
例如:Userservice层中saveUser方法
5)xml配置文件中添加AOP约束文件,并配置切面
如:
<!--配置aop-->
<aop:config>
<!--配置切入点(即是否执行连接点)service下所有类的所有方法-->
<aop:poincut expression="within(cn.tedu.service.*)" id="ps"/>
<!--/配置切面-->
<aop:aspect id="asp" ref="txAspect">
<!--配置切面中的通知-->
<aop:around method="around" ponintcut-ref="pc"
</aop:aspect>
</aop:config>
5 为什么要用Spring的Aop
如果直接将处理事务的,权限控制的等代码写入service中,耦合度太高且不易于维护,代码重复太多,降低复用性。使用静态代理解决了耦合度这一问题,但复用性问题没解决。然而使用JDK动态代理,虽然解决了复用性问题,但是要求此类必须有接口。随后使用Spring框架的CGLib动态代理解决了必须要求接口问题,但又解决不了进行目标方法的过滤。然而Spring框架的AOP通过切入点可以进行目标方法的过考虑。此为优啊!