AOP
(1)基本概念
1 AOP底层原理是动态代理
有两种情况
(1)有接口情况,使用JDK动态代理
(2)没有接口情况,使用CGLIB动态代理
* 创建对象的代理对象,使用代理对象替代之前的对象实现功能
(2)AOP底层(动态代理)
动态代理实现(JDK动态代理)
1 如果使用JDK动态代理,使用Proxy类里面的方法创建代理对象 (1)调用newProxyInstance方法 有三个参数: 第一个参数:类加载器 第二个参数:增强的方法所在类,实现的接口,可以是多个接口 第三个参数:实现这个接口InvocationHandler,创建代理对象,写增强的部分
2 动态代理代码 //生成代理对象,写增强的部分 class CalCulatorProxy implements InvocationHandler {
//1 把创建的是谁的代理对象,把谁传递过来 //因为创建CalCulatorImpl代理对象,传递CalCulatorImpl过来 //1.1 使用有参数构造传递 private Object cal;
public CalCulatorProxy(Object cal) { this.cal = cal; }
/* * 第一个参数:代理对象 * 第二个参数:方法 * 第三个参数:方法传递参数 * * */ //写增强的部分 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法之前执行......"+method.getName()+" :传递参数:"+Arrays.toString(args));
//让增强类里面的方法执行 Object obj = method.invoke(cal, args);
System.out.println("方法之后执行......"+obj); return obj; } }
CalCulatorImpl cal = new CalCulatorImpl(); //返回创建代理对象 CalCulatorInterface calInterface= (CalCulatorInterface) Proxy.newProxyInstance(JdkProxy.class.getClassLoader(), interfaces, new CalCulatorProxy(cal)); // 接口 = new 实现类对象;
//测试的方法 int result = calInterface.cheng(1, 5); System.out.println("result:"+result); |
(3)AOP术语
AOP术语
1横切关注点 (1)不是核心部分,有没有程序都可以运行,只是有个这个横切关注点,功能更加强大
2 连接点
3 切入点
4 通知(增强)
5 切面 |
Spring做AOP操作
1 spring做aop操作有多种方式 (1)基于aspectj的注解方式(使用) (2)基于xml配置方式
2 什么是aspectj (1)aspectj不是spring的一部分,是单独的框架 (2)在实际操作中,在spring经常使用aspectj进行aop操作
扩展:spring4.x使用注解需要导入aop的jar包,如果使用3.x不需要导入aop的jar包
(3)提供五种通知类型的注解 ① @Before:前置通知,在方法执行之前执行 ② @After:后置通知,在方法执行之后执行 ③ @AfterRunning:返回通知,在方法返回结果之后执行 ④ @AfterThrowing:异常通知,在方法抛出异常之后执行 ⑥ @Around:环绕通知,围绕着方法执行 |
总结
1 spring配置连接池 (1)引入外部属性文件
2 bean管理(注解创建对象) (1)导入jar包,包含aop的jar包 (2)在spring配置文件中开启包扫描 (3)在类上面使用注解可以创建 * 使用四个注解都可以用来创建对象 @Component @Repository @Service @Controller
3 bean管理(注解注入属性) 在类的属性上面使用注解就可以实现注入 @AutoWired:根据类型注入 @Qualifier:根据名称注入,和@AutoWired一起使用 @Resource:根据类型和名称注入,不是spring提供的注解
4 什么是aop (1)AOP是面向切面编程 (2)AOP不改变源代码情况下,增强类的方法的功能 (3)AOP底层使用动态代理 (4)动态代理有两种情况: 第一种有接口情况,使用jdk动态代理 第二种没有接口情况,使用cglib动态代理
5 aop底层动态代理(看懂)
6 aop操作术语 (1)连接点 (2)切入点 (3)通知 * 五种通知 (4)切面
7 aspectj (1)aspectj不是spring一部分,单独的框架,和spring一起使用进行aop操作 |
AOP总结
aop有接口情况,使用jdk动态代理,
如果没有接口,使用cglib动态代理
2 AOP总结
(1)AOP是面向切面编程
(2)AOP不改变源代码情况下,增强类的方法的功能
(3)AOP底层使用动态代理
(4)动态代理有两种情况:
第一种有接口情况,使用jdk动态代理
第二种没有接口情况,使用cglib动态代理`