关键词:
3.1 动态代理
动态代理是指,程序在整个运行过程中根本就不存在目标类的代理类,目标对象的代理
对象只是由代理生成工具(不是真实定义的类)在程序运行时由 JVM 根据反射等机制动态
生成的。代理对象与目标对象的代理关系在程序运行时才确立。
3.1.1 JDK
动态代理的实现方式常用的有两种:使用 JDK 的 Proxy,与通过 CGLIB 生成代理。
Jdk 的动态要求目标对象必须实现接口,这是 java 设计上的要求。
从 jdk1.3 以来,java 语言通过 java.lang.reflect 包提供三个类支持代理模式 Proxy, Method 和
InovcationHandler。
3.1.2 CGLIB 动态代理( 了解)
CGLIB(Code Generation Library)是一个开源项目。是一个强大的,高性能,高质量的 Code
生成类库,它可以在运行期扩展 Java 类与实现 Java 接口。它广泛的被许多 AOP 的框架
使用,例如 Spring AOP。
使用 JDK 的 Proxy 实现代理,要求目标类与代理类实现相同的接口。若目标类不存在
接口,则无法使用该方式实现。但对于无接口的类,要为其创建动态代理,就要使用 CGLIB
来实现。
CGLIB 代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代
理对象。所以,使用 CGLIB 生成动态代理,要求目标类必须能够被继承,即不能是 final 的
类。
CGLIB 经常被应用在框架中,例如 Spring ,Hibernate 等。cglib 的代理效率高于 Jdk。
项目中直接使用动态代理的地方不多。一般都使用框架提供的功能。
3.2 不使用 AOP 的开发方式 (理解)
Step1: 项目 aop_leadin1
先定义好接口与一个实现类,该实现类中除了要实现接口中的方法外,还要再写两个非
业务方法。非业务方法也称为交叉业务逻辑:
? doTransaction():用于事务处理
? doLog():用于日志处理
然后,再使接口方法调用它们。接口方法也称为主业务逻辑。
Step2: 项目 aop_leadin2
当然,也可以有另一种解决方案:将这些交叉业务逻辑代码放到专门的工具类或处理类
中,由主业务逻辑调用。
Step3: 项目 aop_leadin3
以上的解决方案,还是存在弊端:交叉业务与主业务深度耦合在一起。当交叉业务逻辑
较多时,在主业务代码中会出现大量的交叉业务逻辑代码调用语句,大大影响了主业务逻辑
的可读性,降低了代码的可维护性,同时也增加了开发难度。
所以,可以采用动态代理方式。在不修改主业务逻辑的前提下,扩展和增强其功能。
功能增强:
package com.bjpowernode.proxy; import com.bjpowernode.utils.ServiceTools; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * Author: 动力节点 * 2019/5/10 */ public class MyInvocationHandler implements InvocationHandler private Object target; public MyInvocationHandler() public MyInvocationHandler(Object target) this.target = target; /** * 实现业务方法的功能增强。 加入日志,事务功能 * @param proxy 生成的代理对象 * @param method 业务方法 * @param args 业务方法的参数 * @return Object 业务方法的返回值 * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable Object result = null; String mname = method.getName(); if( "doSome".equals(mname)) //在目标方法调用之前加入日志 ServiceTools.doLog(); //执行目标方法 result = method.invoke(target, args); //doSome //在目标方法调用之后加入事务 ServiceTools.doTrans(); else //doOther //执行目标方法 result = method.invoke(target, args); //目标方法的执行结果 return result;
代码第二部分
package com.bjpowernode; import com.bjpowernode.proxy.MyInvocationHandler; import com.bjpowernode.service.SomeService; import com.bjpowernode.service.SomeServiceImpl; import java.lang.reflect.Proxy; /** * Hello world! * */ public class App /*public static void main( String[] args ) System.out.println( "Hello World!" ); SomeService service = new SomeServiceImpl(); service.doSome(); System.out.println("===================="); service.doOther(); */ public static void main( String[] args ) System.out.println( "Hello World!" ); //目标对象 SomeService target = new SomeServiceImpl(); //创建InvocationHandler的实现类对象 MyInvocationHandler handler = new MyInvocationHandler(target); //创建代理对象 SomeService proxy = (SomeService) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler); //com.sun.proxy.$Proxy0 jdk的动态代理类型 System.out.println("proxy:"+proxy.getClass().getName()); //通过代理对象执行业务方法,实现功能的增强 proxy.doSome(); System.out.println("-----------------------------"); proxy.doOther();
3.3 AOP 概述
3.4 AOP
AOP(Aspect Orient Programming),面向切面编程。面向切面编程是从动态角度考虑程
序运行过程。
AOP 底层,就是采用动态代理模式实现的。采用了两种代理:JDK 的动态代理,与 CGLIB
的动态代理。
spring框架--aop面向切面编程(代码片段)
Spring框架往期文章Spring框架(一)–spring搭建和IOCSpring框架(二)–SpringBean管理Spring框架(三)–SpringJDBCSpring框架(四)–AOP面向切面编程Spring框架(五)–Spring事务管理和Spring事务传播行为AOP(AspectOrientedProgramming面向切面编程)不使用AOP的开... 查看详情
面向切面编程的介绍和使用(spring框架)
Spring框架整理第二发,AOP的介绍和使用。AOP概述AOP:aspectorientedprogramming:面向切面编程OOP:ObjectOrientedprogramming:面向对象编程AOP和OOP是两种编程思想,AOP是OOP的一种补充。面向切面编程:是指在程序... 查看详情
spring框架—面相切面编程aop
spring框架(2)—面相切面编程AOP AOP(AspectOrientedProgramming),即面向切面编程。 可以说是OOP(ObjectOrientedProgramming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共... 查看详情
spring框架--aop面向切面编程(代码片段)
Spring框架往期文章Spring框架(一)–spring搭建和IOCSpring框架(二)–SpringBean管理Spring框架(三)–SpringJDBCSpring框架(四)–AOP面向切面编程Spring框架(五)–Spring事务管理和Spring事务传播行为AOP(AspectOrientedProgramming面向切面编程)不使用AOP的开... 查看详情
spring面向切面编程(aop)(代码片段)
Spring系列教程Spring框架介绍Spring框架模块Spring开发环境搭建(Eclipse)创建一个简单的Spring应用Spring控制反转容器(InversionofControl–IOC)理解依赖注入(DI–DependencyInjection)BeanXML配置(1)-通过XML配置加载BeanBeanXML配置(2)-Bean作... 查看详情
面向切面编程(aop)
...tPoint(连接点):那些被拦截到的点,主要指方法,因为spring框架中只支 查看详情
aop(面向切面编程)
...种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度 查看详情
spring学习5:面向切面编程(aop)(代码片段)
...AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分 查看详情
aop面向切面编程(个人笔记1.1)(代码片段)
AOP面向切面编程AOP面向切面编程存在的实现方式经典的基于代理的AOP:AspectJAOP面向切面编程AOP(Aspect-OrientedProgramming:面向切面编程)将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权... 查看详情
aop:面向切面
...装成切面,利用AOP容器功能将切面织入到主业务逻辑 Spring AOP是Spring框架中的一部分,但可以作为一个独立的模块单独存在。Spring A 查看详情
spring的aop面向切面编程
什么是AOP?1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程。 功能:让关注点代码与业务代码分离!关注点: 重复代码就叫做关注点;业务代码: ... 查看详情
aop思想(面向切面编程)
...解AOP的童鞋看透弄懂AOP,也欢迎高手批评指正。先说一个Spring是什么吧,大家都是它是一个框架,但框架这个词对新手有点抽象,以致于越解释越模糊,不过它确实是个框架的,但那是从功能的角度来定义的,从本质意义上来讲... 查看详情
面向切面编程的介绍和使用(spring框架)
Spring框架整理第二发,AOP的介绍和使用。AOP概述AOP:aspectorientedprogramming:面向切面编程OOP:ObjectOrientedprogramming:面向对象编程AOP和OOP是两种编程思想,AOP是OOP的一种补充。面向切面编程:是指在程序... 查看详情
面向切面编程(aop)(代码片段)
结合设计模式,通过代码理解面向切面编程通过,结构型设计模式,装饰器模式来实现AOP///<summary>///装饰器模式实现静态代理///AOP在方法前后增加自定义的方法///</summary>publicclassDecoratorAOPpublicstaticvoidShow()Useruser=newUser()Name="... 查看详情
spring的aop面向切面编程
用设计模式是思想理解:面向切面编程1、spring自动生成代理类 Spring的AOP面向切面编程什么是AOP?1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程。 功能:让关注点代码与业... 查看详情
jfinal——aop面向切面编程(代码片段)
...的学习,至今还是不能熟练地掌握和运用。今天针对jfinal框架的AOP,重点理解AOP的思想及实现。这里有篇Thoughtworks大牛之作,他所描述的AOP让我有种新的认知轻松理解AOP思想(面向切面编程)Jfinal中的AOPAOP概述传统AOP实现需要引入... 查看详情
javaee框架整合技术之spring02-aop面向切面编程技术(代码片段)
Spring新注解Spring5.0之后的注解称为新注解使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置注解说明@Configuration表示当前类是一个配置类,用于代替配置文件,相当于applicationContext.xml@Bean作用于... 查看详情
javaee框架整合技术之spring02-aop面向切面编程技术(代码片段)
Spring新注解Spring5.0之后的注解称为新注解使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置注解说明@Configuration表示当前类是一个配置类,用于代替配置文件,相当于applicationContext.xml@Bean作用于... 查看详情