首页 > 其他分享 >AOP - 自己写 JDK 动态代理增强 bean

AOP - 自己写 JDK 动态代理增强 bean

时间:2024-10-20 09:43:49浏览次数:6  
标签:applicationContext JDK Object bean user AOP method User

AOP 的原理就是给目标对象创建代理对象,达到增强目标对象方法的目的

如果目标对象实现了接口就是用 JDK 动态代理,如果没实现接口就是用三方的 CGLIB 代理

如果不使用 AOP 想要增强一个 bean 可以这样做:

@Component
public class Test implements BeanPostProcessor, ApplicationContextAware {

    private ApplicationContext applicationContext;

    // ApplicationContextAware 感知回调回传 IOC 容器
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    // bean 工厂后置处理器,拦截所有的 bean
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 只增强 User bean
        if (bean instanceof User) {
            User user = (User) applicationContext.getBean("user");
            return Proxy.newProxyInstance(
                    user.getClass().getClassLoader(),
                    user.getClass().getInterfaces(),
                    (Object proxy, Method method, Object[] args) -> {
                        // 如果不是 sayHello 方法不增强(只增强 sayHello 方法)
                        if (!method.getName().equals("sayHello")){
                            return method.invoke(user, args);
                        }
                        System.out.println("执行前.....");
                        Object invoke = method.invoke(user, args); // 执行 bean 本身的方法,这里就是 sayHello
                        System.out.println("执行后.....");
                        return invoke;
                    }
            );
        }
        // 如果 bean 不是 User 直接返回原来的
        return bean;
    }
}

标签:applicationContext,JDK,Object,bean,user,AOP,method,User
From: https://www.cnblogs.com/cyrushuang/p/18486956

相关文章

  • AOP - 切点表达式
    某个特殊的方法:com.example.service.UserService类中所有以find开头的公共方法execution(public*com.example.service.UserService.find*(..))类中的所有方法:com.example.service包下所有类的所有方法execution(*com.example.service.*.*(..))特定参数类型的方法......
  • AOP - Advisor 示例
    定义通知publicclassLoggingAdviceimplementsMethodInterceptor{@OverridepublicObjectinvoke(MethodInvocationinvocation)throwsThrowable{System.out.println("Method"+invocation.getMethod().getName()+"isbeingcalle......
  • AOP - AspectJ 示例
    //自定义注解@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public@interfaceLogExecution{}@Aspect//切面类@Order(1000)//数字越小,优先级越高@Component//也要注册到容器publicclassLoggingAspect{//定义切点@Pointcut("ex......
  • SpringAop学习笔记
    SpringAop学习笔记文章目录SpringAop学习笔记1.面向切面编程(AOP)1.1代理模式1.2静态代理1.3动态代理2.AOP概念及相关术语2.1概述2.2相关术语①横切关注点②通知(增强)③切面④目标⑤代理⑥连接点⑦切入点2.3作用3.基于注解的AOP3.1技术说明3.2准备工作3.3创......
  • JDK 21更新:switch语句的类型模式匹配与守卫模式
    Java语言自诞生以来,一直在不断演进,以满足开发者日益复杂的需求。switch语句作为一种控制流结构,在Java中有着广泛的应用。随着JDK21的发布,switch语句和表达式得到了显著增强,使其在处理复杂条件和类型检查方面更加灵活和强大。本文将详细探讨JDK21中switch语句和表达式的更......
  • 一步到位:在Windows上轻松配置JDK环境变量的详细指南
    Windows系统配置JDK环境变量配置JDK环境变量是确保Java开发工具可以在命令行中正确运行的关键步骤。以下是针对Windows系统配置JDK环境变量的通用步骤:确定JDK安装路径:找到你安装JDK的路径。我的是D:\JAVA\JDK设置JAVA_HOME环境变量:右键点击“此电脑”或“我的电脑”......
  • Java中JDK8-17新特性下
    JDK8-17新特性(第二部分)目录JDK8-17新特性(第二部分)switch表达式增强文本块标准化模式匹配局部变量类型判断switch表达式增强在Java中,switch语句的增强主要体现在Java12引入的预览特性(并在Java14中成为正式特性)中,即所谓的“SwitchExpressions”(switch表达式)。这个新特性使得s......
  • JDK 安装教程
    在Java开发中,安装JDK(JavaDevelopmentKit)是第一步。本文将详细介绍JDK的安装过程,确保你能顺利搭建Java开发环境。一、准备工作下载JDK打开浏览器,访问Oracle官方网站。在官网找到JDK下载页面,根据你的操作系统选择对应的版本进行下载。例如,Windows系统可以......
  • AOP
    SpringAOPOOP:Object-OrientedProgramming,面向对象编程;AOP:Aspect-OrientedProgramming,面向切面编程Advisor:spring自己的AOP组件;AspectJ:三方实现的AOP组件底层对bean创建代理对象,达到增强目的。如果目标bean实现了接口,就用JDK动态代理;如果没有,就用CGLIB声明式......
  • JDK收费的各个版本
    OpenJDK免注册下载地址: https://jdk.java.net/archive/ Java收费的安装包使用的时候要闭坑从2019年1月份开始,OracleJDK开始对JavaSE8之后的版本开始进行商用收费,确切的说是8u201/202之后的版本。如果你用Java开发的功能如果是用作商业用途的,如果还不想花钱购买的话......