听说坚持一件事后果很严重,鄙人不信邪,表示要试试。😃 此博文仅为学习笔记,每天记录。防止错误观念传播,萌新谨慎观看 :)
spring第二天
spring核心功能之二
二、Aop(面向切面编程)
动态代理
功能:在不改变原有代码的情况下,为程序增加功能。
分类:JDK动态代理:对象必须要实现接口,主要通过Proxy、Method\InvocationHandler 实现
CGLIB动态代理:对象要求比较宽松,第三方的工具库。创建代理对象,原理是继承,通过继承目标类,创建子类。子类就是代理对象,要求目标类不能是final的
实现步骤:
1、需要一个目标类(对该类进行增强)
2、创建IncocationHandler接口的实现类,在该实现类给目标方法进行增强。
3、使用JDK中Proxy创建代理对象。
创建目标对象
·
//接口
public interface StudentService {
void doHomeWork();
void doSomeThint();
}
//实现类
public class StudentServiceImpl implements StudentService{
@Override
public void doHomeWork() {
System.out.println("doHomeWork");
}
@Override
public void doSomeThint() {
System.out.println("doSomeThint");
}
}
//需要插入的功能类
public class StudentTools {
public static void doLog() {
System.out.println("log");
}
public static void doDate() {
System.out.println("doDate"+new Data());
}
}
`
创建InvocationHandler对象
public class TestInvocationHandler implements InvocationHandler {
private Object target;
public TestInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//通过代理方法执行时,会调用invoke方法
Object res=null;
StudentTools.doLog();
//执行目标类的方法,通过method实现
res=method.invoke(target, args);
StudentTools.doDate();
return res;
}
}
创建代理, 通过代理执行方法
public class TProxy {
public static void main(String[] args) {
//使用JDK的Proxy创建代理对象
StudentService targetService=new StudentServiceImpl();
//创建InvocationHandler对象
InvocationHandler handler=new TestInvocationHandler(targetService);
//使用proxy创建代理
StudentService proService=(StudentService) Proxy.newProxyInstance(targetService.getClass().getClassLoader(), targetService.getClass().getInterfaces(), handler);
//通过代理执行方法,调用handler中的invocake()
proService.doHomeWork();
}
}
·
作用
1、在目标类源代码不动的情况下,增加功能
2、减少代码的重复
3、专注业务逻辑代码
4、解耦合,让业务功能与非业务功能分开。
Aop(面向切面编程 Aspect Orient programming)
基于动态代理,可以使用JKD跟CGLIB两种方式。AOP就是动态代理的规范化,把动态代理的实现步骤,方式都定义好了。让开发人员用一种统一的方式使用动态代理。
Aspect:切面 给你的业务类增加功能就是切面,上面的doLog(),doDate()都是切面。切面的特点:一般都是非业务方法,可以独立使用。
理解面向切面编程:
OOP:面向对象编程:用对象构建项目
AOP:1、在分析项目时找出切面
2、找出切面使用时间
3、合理的安排切面执行的位置
术语:
1、Aspect 切面 表示增强的功能(常用的功能:日志、事务、权限验证、参数检查)
2、JoinPoint 连接点 某个类中的业务方法
3、PointCut 切入点 多个连接点方法的集合
4、目标对象 给哪个类增强功能,该类就是目标对象
5、Advice 通知 通知表示切面的执行时间
切面的三个要素
1、切面的功能代码,切面要干什么
2、切面的执行位置,PointCut切面的位置
3、切面的执行时间,Advice 切面的时间。
END 未完待续