-
通过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; } }
Mianpackage 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(); } }
Aoppackage 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个答案 按时间排序 按投票排序
-
采纳的答案
切入点写错了
"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"是一个典型的Java后端开发整合示例,涵盖了Spring框架、ORM工具和数据库的协同工作。通过这个过程,开发者可以学习到如何构建高效、可维护的数据访问层,为...
获取类的 Class 对象构造类的实例化对象获取-个类的所有信息 获取类中的变量(Field) 获取类中的方法(Method) 获取类的构造器(Constructor) 获取注解 通过反射调用方法反射的应用场景 Spring 的 IOC 容器反射 + 抽象...
Spring框架则是一个全面的企业级应用开发框架,它包含了依赖注入(DI)、面向切面编程(AOP)、数据访问/集成、Web应用、批处理和消息传递等多个模块。在本项目中,Spring4.2.4.RELEASE版本提供了对Spring MVC的支持...
`static`用于声明类级别的变量和方法,不依赖于类的实例就能访问。`final`可以修饰变量、方法和类,表示不可变性或防止重写。 Java SOLID原则是软件设计的基石,包括: 1. 单一职责原则(SRP):每个类只负责一个...
Proxy类提供了创建代理对象的方法,而InvocationHandler接口定义了调用处理程序的接口,它包含一个invoke方法,当通过代理对象调用方法时,实际上会执行这个invoke方法。 接着,我们引入注解(Annotation)。注解是...
- **默认**(无修饰符):只限于同一个包内的类可以访问。 ##### 3. String类型 - **String**不是基本数据类型,它是对象,实现了`Serializable`和`Comparable<String>`接口。 ##### 4. 浮点型变量赋值 - `float f...
Spring AOP通过动态代理机制实现了切面,有两种主要的实现方式:基于JDK的动态代理和基于CGLIB的动态代理。JDK代理适用于实现了接口的类,而CGLIB代理则用于没有接口或者接口方法不够用的情况。在SpringBoot中,我们...
在这个例子中,`ExampleBean`类有一个名为`dependency`的成员变量,Spring会通过调用`setDependency`方法来设置这个成员变量的值。 2. **通过构造方法注入**: 构造方法注入是在类的构造器中传入依赖对象。Spring...
文件"123-虚拟机-23-类加载_final修饰基本类型变量的原理"、"124-虚拟机-24-类加载_将符号引用变为直接引用"、"119-虚拟机-19-类加载_验证类对象位于堆"以及"126-虚拟机-26-类加载_能假冒一个System类吗"都涉及到了...
- **泛型**:允许在类、接口和方法中使用类型参数,增强了类型安全性和代码复用性。在我们的Bean工厂中,可以使用泛型来表示Bean的类型。 - **枚举类型**:提供了一种创建常量集的方式,可以替代传统的final ...
- **动态代理**: 使用Spring AOP(面向切面编程)来拦截数据访问层(DAO层)的方法调用,根据一定的规则(如注解或上下文变量)选择合适的DataSource。 - **数据库路由**: 根据查询条件自动选择合适的数据源。 本篇...
在IT行业中,Spring框架是Java应用开发的基石,它提供了丰富的功能,包括依赖注入、AOP(面向切面编程)以及各种模块,如Spring MVC、Spring Boot等。邮件服务是许多应用程序中的一个常见需求,例如发送确认邮件、...
4. **Java 类中的注入**:通过 setter 方法或者构造函数进行依赖注入,使对象能够在运行时动态获取它们所需的依赖。 5. **事务管理 - 代码编程式模板类**:编程式事务管理通过在代码中显式调用事务管理 API 来控制...
final类不可被继承,final方法不能被重写,final变量一旦赋值后不能改变,常用于声明常量。对于引用类型,final修饰的引用变量其引用地址不能改变,但引用的对象状态可以改变。 3. **抽象类与接口的区别**: - ...
// 假设这里有一个变量executionTime记录了方法执行的时间 long executionTime = System.currentTimeMillis(); System.out.println(methodName + " executed in " + executionTime + "ms"); } } ``` 4. **...
- 枚举类型可以拥有构造方法、成员变量和方法。 ##### 2. 枚举的基本应用 - 枚举常用于定义一组固定的常量,如方向、颜色等。 ##### 3. 带有构造方法的枚举 - 枚举可以定义构造方法,用于初始化枚举实例的私有成员...
`MethodWriter`是ASM库中的一个关键类,它是`MethodVisitor`的子类,用于构建和写入方法的信息到字节码表示中。下面将详细讨论`MethodWriter`及其相关知识点。 1. **MethodWriter与MethodVisitor** `MethodWriter`...
抽象类是可以有私有的方法或变量的,通过把类或者类中的方法声明为 abstract 来表示一个类是抽象类,被声明为抽象的方法不能包含方法体。 内部类是指在另一个类中定义的类,包括静态内部类、局部内部类、匿名内部类...
在Java开发领域,Spring框架是应用最广泛的轻量级框架之一,它以其强大的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)能力而闻名。本篇文章将深入探讨如何使用...
- `super` 用于访问父类的属性和方法,也可在子类构造方法中通过 `super()` 调用父类的构造方法,必须位于构造方法的第一行。 4. **final, finally, finalize 的区别** - `final` 修饰变量、方法或类,表示不可变...