6 aop
1.动态代理
jdk动态代理:使用jdk的Proxy,Method,InvocationHandler创建代理对象。
jdk动态代理要求目标类必须实现接口
cglib动态代理:第三方的工具库,创建代理对象,原理是继承。通过继承目标类,创建子类。
子类就是代理的对象。要求看目标类不能是final的,方法也不能是finall的
2.动态代理的作用:
1)在目标类源代码不改变的情况下,增加功能。
2)减少代码的重复
3)专注业务逻辑代码
4)解耦合,让你的业务功能和日志,事务非业务功能分离。
3. AOP:面向切面编程,基于动态代理,可以使用jdk,cglib两种代理方式
AOP就是动态代理规范化,把动态代理的实现步骤,方式都定义好了,
让开发人员用一种统一的方式,使用动态代理。
使用使用jdk的Proxy创建代理对象
补充invoke方法
添加类属性target 并写入有参构造方法
2.在实现类中使用jdk的Proxy创建代理对象
/创建目标对象
Student target = new StudentImpl();
//创建InvocationHandler对象
InvocationHandler handler = new MyIncationHandler(target);
//使用Proxy创建代理
Class clazz;
Student proxy = (Student) Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler);
//通过代理执行方法,会调用handler中的invoke()
proxy.doSome();
aop:看做时动态代理的规范化,把实现动态代理的步骤进行了一个规范,定义
术语:
1.Aspect:切面,来表示增强的功能。
2.JoinPoint : 连接点,来连接业务方法和切面的位置
3.Pointcut : 切入点,之多个连接点方法的集合
4.目标对象:给哪个类的方法增加功能
5.Advice:通知,通知表示切面功能执行的时间
一个切面的三要素:
1.切面的功能代码(切面要干什么)
2.切面的执行位置(使用Pointcut表示切面执行的位置)
3.切面的执行时间(使用Advice表示时间,在目标方法之前,还是目标方法之后)
什么时候考虑用aop技术
1.当要给一个系统中存在的类修改功能,但是原有的类不完善,需要aop增加功能
2.要给一个项目中的多个类,增加一个相同的功能,使用aop
3.给业务方法增加事务,日志输出
aspectj框架的使用
execution(访问修饰符 返回值 包名.类名.方法名(方法参数) 异常)
在配置文件中加入
<aop:aspectj-autoproxy />
1.@Before 前置通知
方法的定义要求:
1.公共方法public
2.方法没有返回值
3.方法名称自定义
4.方法可以有参数,也可以没有参数。
如果有参数,参数不是自定义,有几个参数类型可以使用
myBefore()属性 :
value ,是切入点表达式,表示切面的功能执行的位置
特点:
1.在目标方法前先执行
2.不会改变目标方法的执行结果
3.不会影响目标方法的执行
2.@AfterReturning 后置通知。
方法的定义要求:
1.公共方法public
2.方法可以有返回值
3.方法名称自定义
4.方法是有参数的,推荐是object,参数名自定义(public String afterThing(Object res))
属性 :
value ,是切入点表达式,表示切面的功能执行的位置
returning 返回的类型 和下面方法参数名称一样,建议类型为Object
特点:
1.在目标方法之后执行
2.能根据目标方法的返回值,可以根据返回值做不同的处理
3.可以修改这个返回值
3.@Around 循环通知
方法的定义要求:
1.公共方法public
2.方法必须有返回值 推荐是Object
3.方法名称自定义
4.方法是有固定参数 ProceedingJoinPoint(public Object aro(ProceedingJoinPoint pj))
属性:
value 切入点表达式
特点:
1.它是功能最强的通知
2.在目标方法的前和后都能增强功能
3.控制目标方法是否被调用
4.修改原来目标方法的执行结果
4.@AfterThrowing 异常通知
方法的定义要求:
1.公用方法public
2.没有返回值
3.方法名称自定义
4.方法有一个Exception ,如果还有就是JoinPoint
属性:
1.value 切入点表达式
2.throwing 自定义的变量,表示目标抛出的异常对象
变量名必须和方法的参数名一样
特点:
1.在目标方法抛出异常是执行
2.可以做异常的监控程序,监控目标函数执行时是否有异常
如果有异常,可以发送邮件,短信进行通知
5.@After 最终通知
方法的定义格式
1.公用方法public
2.没有返回值
3.方法名称自定义
4.方法没有参数,如果还有就是JoinPoint
属性:
value 切入点表式
特点:
1.总是会执行
2.在目标方法之后执行的
6.@Pointcut 定义管理切入点
方法:
管理切入点公式
下方方法public,void,没有参数,可用函数名代替该切入点公式
Cglib框架
没有接口类时,Spring自动使用Cglib动态代理
有接口类时,在切面扫面器上加一个属性 proxy-target-class = “true”