您当前的位置:首页 > 互联网教程

Java AOP的底层实现原理

发布时间:2025-05-21 07:07:35    发布人:远客网络

Java AOP的底层实现原理

一、Java AOP的底层实现原理

1、Java AOP的底层实现原理主要依赖于AOP代理,分为静态代理和动态代理。

2、静态代理:核心原理:通过在编译阶段生成代理类来实现AOP。典型框架:AspectJ,它是Java的扩展,专门用于面向切面编程。实现方式:AspectJ有自己的编译器,在编译阶段将切面织入Java字节码中。运行时,这些字节码已经是增强后的AOP对象。关键方法:在代理类中,通过调用proceed方法来执行被代理类的方法。

3、动态代理:核心原理:不修改字节码,而是在内存中创建临时的AOP对象,这些对象包含目标对象的方法并进行增强处理。典型框架:Spring AOP。实现方式: JDK动态代理:通过反射接收被代理类,并要求被代理类实现接口。核心在于InvocationHandler接口和Proxy类。 CGLIB动态代理:若目标类未实现接口,Spring AOP将使用CGLIB。CGLIB是一个代码生成类库,可以在运行时动态生成类的子类。拦截与增强:动态代理在运行时拦截对象的方法调用,进行改造和增强。

4、综上所述,Java AOP通过静态代理和动态代理两种方式,在编译阶段或运行时对目标对象的方法进行增强处理,从而实现了横切关注点的模块化。

二、java开发中常用aop吗

1、AOP切面算是比较理论的东西,使用较少,属于总结出来的理论,大多数人都知道,但不会专门地使用,一般都是默认会操作。比如将一些通用的方法单独写一个类,这些都是写代码时候自己会用的,并不算是很特别、专门拿出来使用、研究的工具

2、工作中java开发,使用最多的为增删改查,其次是用debug来调试程序解决问题,联调测试等等。

三、java advice

java advice是什么,让我们一起了解一下?

Advice是在Join Point上执行的一个动作或者通知,一般通过拦截器调用。Spring有两大核心,IOC和AOP,在模块AOP里面有个advice。

在Spring-AOP中,增强(Advice)是如何实现的?

按照增强在目标类方法连接点的位置可以将增强划分为以下五类:

前置增强(org.springframework.aop.BeforeAdvice)表示在目标方法执行前来实施增强。

后置增强(org.springframework.aop.AfterReturningAdvice)表示在目标方法执行后来实施增强。

环绕增强(org.aopalliance.intercept.MethodInterceptor)表示在目标方法执行前后同时实施增强。

异常抛出增强(org.springframework.aop.ThrowsAdvice)表示在目标方法抛出异常后来实施增强。

引介增强(org.springframework.aop.introductioninterceptor)表示在目标类中添加一些新的方法和属性。

实战操作:Spring中Advice简单案例

@Configuration//配之类@EnableAspectJAutoProxy//启用AspectJ自动代理@ComponentScan(basePackages = {"spring01","spring02"}) //basePackages指定扫描的包 public class Config {}

@Aspect@Component public class Audience {    /**     * 相当于访问相同报下的不同的类,他们拥有相同的包路径,可以定义一个变量     */    @Pointcut("execution(* spring02.aspect.Performance.perform(..))")    public void performance(){    }     @Before("performance()")    public void silenceCellPhones(){        System.out.println("====表演前将手机调静音");    }     @Before("performance()")    public void takeSeats(){        System.out.println("====表演前就做");    }     @AfterReturning("performance()")    public void applause(){        System.out.println("====表演后鼓掌");    }     @AfterThrowing("performance()")    public void demandRefund(){        System.out.println("====表演失败时退款");    }    @Around("performance()")    public void  watchPerformance(ProceedingJoinPoint point){        try {            System.out.println("====观看前1");            point.proceed();            System.out.println("====观看后2");        } catch (Throwable throwable) {            throwable.printStackTrace();        }    }}

public interface Performance { void perform();}

@Component("performance") public class PerformanceImpl implements Performance{    @Override    public void perform() {        System.out.println("======表演开始=====");    }}

5、测试类@RunWith(SpringJUnit4ClassRunner.class)//启动测试时创建Spring上下文@ContextConfiguration(classes = {Config.class})//配置文件对象 public class TestClass {    @Autowired    private Performance performance;    @Test    public void test(){        performance.perform();    }}