Spring AOP - Access to Repositories autowired field by reflection(Spring AOP--通过反射访问存储库自动生成的字段)
问题描述
这是第一次在AspectJ中,我可能需要访问存储库的本地私有自动连接字段,以便准确地在该实例上执行某些操作。
我创建了一个切入点,重点放在每个@Repository
注释类的每个方法上。当切入点触发时,我获取要从中获取bean
字段的当前类实例。
这是办法:
@Repository
public class MyDao {
@Autowired
private MyBean bean;
public List<Label> getSomething() {
// does something...
}
}
@Aspect
@Component
public class MyAspect {
@Pointcut("within(@org.springframework.stereotype.Repository *)")
public void repositories() {
}
@Before("repositories()")
public void setDatabase(JoinPoint joinPoint) {
try {
Field field = ReflectionUtils.findField(joinPoint.getThis().getClass(), "bean"); // OK since here - joinPoint.getThis().getClass() -> MyDao
ReflectionUtils.makeAccessible(field); // Still OK
Object fieldValue = ReflectionUtils.getField(field, joinPoint.getThis());
System.out.println(fieldValue == null); // true
// should do some stuff with the "fieldValue"
} catch (Exception e) {
e.printStackTrace();
}
}
}
fieldValue
始终为null
,即使我改为创建类似private | public | package String something = "blablabla";
的内容。
我已确保在应用程序启动时实际实例化了"Bean"(使用调试器进行了验证)。
我关注了How to read the value of a private field from a different class in Java?
我错过了什么?|有可能吗?|有没有其他方法?
推荐答案
@springbootlearner建议使用此方法access class variable in aspect class
我所要做的就是将joinPoint.getThis()
替换为joinPoint.getTarget()
最终解决方案是:
@Aspect
@Component
public class MyAspect {
/**
*
*/
@Pointcut("within(@org.springframework.stereotype.Repository *)")
public void repositories() {
}
/**
* @param joinPoint
*/
@Before("repositories()")
public void setDatabase(JoinPoint joinPoint) {
Object target = joinPoint.getTarget();
// find the "MyBean" field
Field myBeanField = Arrays.stream(target.getClass().getDeclaredFields())
.filter(predicate -> predicate.getType().equals(MyBean.class)).findFirst().orElseGet(null);
if (myBeanField != null) {
myBeanField.setAccessible(true);
try {
MyBean bean = (MyBean) myBeanField.get(target);// do stuff
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
这篇关于Spring AOP--通过反射访问存储库自动生成的字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Spring AOP--通过反射访问存储库自动生成的字段
基础教程推荐
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 在螺旋中写一个字符串 2022-01-01