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()//提交事务

}catchException e{

  Tm.Rollback();//事务回滚

}

}

})

}

测试部分:

UserService    Service=(UserService)context.getBean(“userService”);

TransactionManager tm=TransactionManagercontext.getBean(“tm”);

Object Proxy=DynamicProxy.getProxy(Service,tm);//得到代理的对象

Proxy.add();

 

动态代理:(Cglib

特点:将来生成的代理对象都是目标对象的子类,无论目标对象是否有接口,都能生成代理对象。

【底层实现:1Enhance enhance=new Enhance()

2、enhance.setInterface(target.getClass().getInterfaces());

3、enhance.setSuperClasstarget.getClass()

4、enhance.setCallback(new MethodInterceptor(){

5、});

6、Return enhance.create();

 

Spring底层用CglibJDK为我们生成代理对象,方法更加的灵活。

 

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>

 

 

通知的类型:

Aopbefore前置通知   在目标方法执行之前要执行的。

AOParound环绕通知  在目标方法执行之前和执行之后都需要执行的通知

Aopafter-returnning后置通知 在目标方法执行之后再执行的通知

Aopafter-throwing异常通知 当执行目标方法之后,抛出异常在执行异常通知

Aopafter最终通知 最后一定会被执行的通知相当于finally

 

 

ProceedingJoinPointer只能是环绕通知使用

 

其他通知只能使用JoinPoint  而且JoinPoint只能是在参数的第一位

0 0