1 0

通过spring aop代理的方法和final方法获取的不是同一个类变量5

目标类的set方法是final的,get方法不是。aop代理之后set的值在get为空。求解这是为什么???前提是final的是客户的框架,我动不了。有什么解决方法吗??
目标方法
package demo.aop;
import org.springframework.stereotype.Component;
@Component("test")
public class TestService  {
    String data;
    public String getData() {
        return data;
    }
    public final void setData(String data) {
        this.data = data;
    }
}
Mian
package demo.aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("demo/aop/applicationContext.xml");
        TestService service=(TestService) context.getBean("test");
//        service.test();
        service.setData("AAA");
        String sss=service.getData();
        System.out.println(sss);
//        service.out();
        
        System.out.println("end");
//        service=new TestService();
//        service.setData("BBB");
//        service.setData0("AAA");
//        service.out();
    }
}
Aop
package demo.aop;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {
    @Pointcut("execution(* demo.aop.*.*test(..))")
    public void testPointCut() {
    }

    @Around("testPointCut()")
    public Object doAround(ProceedingJoinPoint point) throws Throwable {
        Object object = point.proceed();
        return object;
    }
}
2012年12月12日 00:16

1个答案 按时间排序 按投票排序

0 0

采纳的答案

切入点写错了
"execution(* demo.aop.*.*test(..))"

应该是如
"execution(* demo.aop.*.*(..))"

不是这的问题

如图


使用cglib会生成目标对象的子类,然后调用set时会直接设置代理对象的data,所以造成了target的data没有设置。 当你调用get方法时因为是final 所以没有被代理 直接调用的是目标对象的,所以是null。
1、解决办法,可以参考之前类似的问题,通过aop解决
http://jinnianshilongnian.iteye.com/blog/1678800

2、如果改不了目标,可以考虑适配器设计模式

2012年12月12日 07:29

相关推荐

    spring4.0整合hibernate5.1.0.Final+mysql5

    综上所述,"Spring4.0整合hibernate5.1.0.Final+mysql5"是一个典型的Java后端开发整合示例,涵盖了Spring框架、ORM工具和数据库的协同工作。通过这个过程,开发者可以学习到如何构建高效、可维护的数据访问层,为...

    Java 基础核心总结 +经典算法大全.rar

    获取类的 Class 对象构造类的实例化对象获取-个类的所有信息 获取类中的变量(Field) 获取类中的方法(Method) 获取类的构造器(Constructor) 获取注解 通过反射调用方法反射的应用场景 Spring 的 IOC 容器反射 + 抽象...

    SSH Maven项目struts2.3.24+spring4.2.4.RELEASE+hibernate5.0.6.Final

    Spring框架则是一个全面的企业级应用开发框架,它包含了依赖注入(DI)、面向切面编程(AOP)、数据访问/集成、Web应用、批处理和消息传递等多个模块。在本项目中,Spring4.2.4.RELEASE版本提供了对Spring MVC的支持...

    java (jvm + juc)+ spring + springcloud + sql + redis 面试大全

    `static`用于声明类级别的变量和方法,不依赖于类的实例就能访问。`final`可以修饰变量、方法和类,表示不可变性或防止重写。 Java SOLID原则是软件设计的基石,包括: 1. 单一职责原则(SRP):每个类只负责一个...

    动态代理加注解实现细粒度的权限管理,具体到方法

    Proxy类提供了创建代理对象的方法,而InvocationHandler接口定义了调用处理程序的接口,它包含一个invoke方法,当通过代理对象调用方法时,实际上会执行这个invoke方法。 接着,我们引入注解(Annotation)。注解是...

    大数据面试宝典包含java基础和spring面试题

    - **默认**(无修饰符):只限于同一个包内的类可以访问。 ##### 3. String类型 - **String**不是基本数据类型,它是对象,实现了`Serializable`和`Comparable<String>`接口。 ##### 4. 浮点型变量赋值 - `float f...

    涵盖SpringBoot的AOP、Slf4j日志门面-springboot-in-action.zip

    Spring AOP通过动态代理机制实现了切面,有两种主要的实现方式:基于JDK的动态代理和基于CGLIB的动态代理。JDK代理适用于实现了接口的类,而CGLIB代理则用于没有接口或者接口方法不够用的情况。在SpringBoot中,我们...

    springday02

    在这个例子中,`ExampleBean`类有一个名为`dependency`的成员变量,Spring会通过调用`setDependency`方法来设置这个成员变量的值。 2. **通过构造方法注入**: 构造方法注入是在类的构造器中传入依赖对象。Spring...

    110-140上传请查阅,谢谢!

    文件"123-虚拟机-23-类加载_final修饰基本类型变量的原理"、"124-虚拟机-24-类加载_将符号引用变为直接引用"、"119-虚拟机-19-类加载_验证类对象位于堆"以及"126-虚拟机-26-类加载_能假冒一个System类吗"都涉及到了...

    自已实现spring ioc功能代码 jdk1.6的一些新特性

    - **泛型**:允许在类、接口和方法中使用类型参数,增强了类型安全性和代码复用性。在我们的Bean工厂中,可以使用泛型来表示Bean的类型。 - **枚举类型**:提供了一种创建常量集的方式,可以替代传统的final ...

    SpringBoot多数据源配置(方式三:基于AOP切面动态切换需要使用哪个数据源).docx

    - **动态代理**: 使用Spring AOP(面向切面编程)来拦截数据访问层(DAO层)的方法调用,根据一定的规则(如注解或上下文变量)选择合适的DataSource。 - **数据库路由**: 根据查询条件自动选择合适的数据源。 本篇...

    spring + mail + 发送邮件完整 demo (含注释)

    在IT行业中,Spring框架是Java应用开发的基石,它提供了丰富的功能,包括依赖注入、AOP(面向切面编程)以及各种模块,如Spring MVC、Spring Boot等。邮件服务是许多应用程序中的一个常见需求,例如发送确认邮件、...

    spring事务管理

    4. **Java 类中的注入**:通过 setter 方法或者构造函数进行依赖注入,使对象能够在运行时动态获取它们所需的依赖。 5. **事务管理 - 代码编程式模板类**:编程式事务管理通过在代码中显式调用事务管理 API 来控制...

    2023Java面试题比较常问

    final类不可被继承,final方法不能被重写,final变量一旦赋值后不能改变,常用于声明常量。对于引用类型,final修饰的引用变量其引用地址不能改变,但引用的对象状态可以改变。 3. **抽象类与接口的区别**: - ...

    如何使用Spring Boot的@Pointcut注解

    // 假设这里有一个变量executionTime记录了方法执行的时间 long executionTime = System.currentTimeMillis(); System.out.println(methodName + " executed in " + executionTime + "ms"); } } ``` 4. **...

    java加强笔记

    - 枚举类型可以拥有构造方法、成员变量和方法。 ##### 2. 枚举的基本应用 - 枚举常用于定义一组固定的常量,如方向、颜色等。 ##### 3. 带有构造方法的枚举 - 枚举可以定义构造方法,用于初始化枚举实例的私有成员...

    14 - ASM之MethodWriter - 简书1

    `MethodWriter`是ASM库中的一个关键类,它是`MethodVisitor`的子类,用于构建和写入方法的信息到字节码表示中。下面将详细讨论`MethodWriter`及其相关知识点。 1. **MethodWriter与MethodVisitor** `MethodWriter`...

    Java面试宝典(含注释)

    抽象类是可以有私有的方法或变量的,通过把类或者类中的方法声明为 abstract 来表示一个类是抽象类,被声明为抽象的方法不能包含方法体。 内部类是指在另一个类中定义的类,包括静态内部类、局部内部类、匿名内部类...

    使用Spring进行装配

    在Java开发领域,Spring框架是应用最广泛的轻量级框架之一,它以其强大的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)能力而闻名。本篇文章将深入探讨如何使用...

    java面试题最容易犯错的8道.docx

    - `super` 用于访问父类的属性和方法,也可在子类构造方法中通过 `super()` 调用父类的构造方法,必须位于构造方法的第一行。 4. **final, finally, finalize 的区别** - `final` 修饰变量、方法或类,表示不可变...

Global site tag (gtag.js) - Google Analytics