SpringAOP学习笔记
一、静态代理
1.首先确定要做的一件事情(接口)
然后就是做这事情的人(实现接口的人)
然后就是帮上面做这事情的人 做事情,这样上面的人就可以不用做。(同样实现接口)
最后是客户来找做这事情的人(找中间商)
2.对上面1.中的静态代理进行再理解
首先确定要做的一件事情(接口)->Service接口
然后就是做这事情的人 ->实现接口的人
然后就是帮上面做这事情的人 做事情,这样上面的人就可以不用做。(同样实现接口)
最后是客户来找做这事情的人 ->找中间商 也就是代理角色
发现:也就是不改变真实角色原先的代码情况下,添加一个日志功能(通过代理角色)
二、动态代理 ->两类: 基于类+基于接口
跟静态代理不同的是,动态代理的代理类是动态生成的,而不是我们直接写好的
·基于类 ->Cglib
·基于接口 ->JDK动态代理 [我们这里使用的就是这种]
·Java字节码实现 ->javassist
需要知道类和接口:代理类Proxy + 调用处理程序(接口)InvoCationHandler
好处:在静态代理好处的基础下,一个动态代理类代表一个接口,一般是对应一类业务
一个动态代理类可代表多个类,只要实现同一个接口
代码:首先确定要做的一件事情(接口)
然后就是做这事情的人(实现接口的人)
然后就是帮上面做这事情的人 做事情,这样上面的人就可以不用做。(同样实现接口)
最后是客户来找做这事情的人 ->找中间商 也就是代理角色
结论:每个代理实例都有一个相对应的关联调用处理实例InvocatIonHandler,
当在代理实例调用方法时,方法将会被编码并分派到其调用处理程序的Invoke()方法。
注意点:应该用共同的接口来转换Proxy的实现类。!!!!!!!重点
因为这边动态代理的是一个接口中的多个实现类,所以转换成接口。
这就是为啥叫做基于接口-JDK动态代理
三、AOP
AOP:面向切面编程,通过预编译方式和运行动态代理实现程序功能的统一维护的技术,
不影响业务代码的情况下,添加新功能的能力。
AOP在Spring中的作用:提供声明式事务,允许用户自定义切面
·横切关注点:跨越应用程序多个模块的方法或功能,即业务无关但需要关注的部分。
比如:日志、安全缓存、事务等等。
·切面(Aspect):横切关注点被模块化的特殊对象。 即它是一个类
·通知(Advice):切面必须要完成的工作。 即它是这个类的方法
·目标(Target):被通知的对象。 即它是接口或者方法
·代理(Proxy):向目标对象应用通知之后创建的对象。 即它是代理类
·切入点(PointCut):切面通知执行的”地点”的定义
·连接点(JointCut):与切人点匹配的执行点
代码:抽象角色(被代理的接口)
真实角色(接口的实现类)
方式一:使用Spring API接口实现
①实现MethodBeforeAdvice接口
②实现AfterReturningAdvice接口
②Spring配置文件beanS.xml
③测试类
④结果
方式二:自定义类[主要是切面定义]
①自定义类
②Spring配置文件beans.2xml
③测试类
④结果
方式三:注解实现AOP
①注解切面
②Spring配置文件bean3.xml
③测试类
④结果