03-spring框架——aop面向切面编程(代码片段)

tpf386 tpf386     2022-12-17     326

关键词:

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作用于... 查看详情