Spring AOP获取不了增强类(额外方法)或无法通过getBean()获取对象
Spring AOP获取不了增强类(额外方法)和无法通过getBean()获取对象
今天在学习AOP发现一个小问题
Spring AOP获取不了额外方法,左思右想发现是接口上出了问题
先上代码
获取不了增强类
UserService接口
public interface UserService {
public void register(User user);
public Boolean login(String name, String password);
}
接口实现UserServiceImpl(原始方法)
这是出问题的地方
import org.User;
import org.aopalliance.aop.Advice;
public class UserServiceImpl implements UserService , Advice{
@Override
public void register(User user) {
System.out.println("UserServiceImpl.register");
}
@Override
public Boolean login(String name, String password) {
System.out.println("UserServiceImpl.login "+name+" "+password );
return true;
}
}
增强类UserPoxyBefore
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class UserPoxyBefore implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("UserPoxyBefore.before");
}
}
接着执行业务代码A
@Test
public void test2() {
ApplicationContext context=new ClassPathXmlApplicationContext("/ApplicationContext2.XML");
UserServiceImpl userService= (UserServiceImpl) context.getBean("UserServicePiont");
userService.login("SY", "123456");
userService.register(new User());
}
}
就发现额外方法没有执行
输出是这样的
2021-05-24 20:51:36 DEBUG DefaultListableBeanFactory:225 - Creating shared instance of singleton bean 'org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#0'
UserServiceImpl.login SY 123456
UserServiceImpl.register
并没有输出预期的UserPoxyBefore.before
检查发现不知在UserServiceImpl处添加进入了Advice接口,Advice接口本身没有任何方法,难以发现
去掉即可
结果如下
UserPoxyBefore.before
UserServiceImpl.login SY 123456
UserPoxyBefore.before
UserServiceImpl.register
正确执行
总结:在组装好切点和指定好切面方法之后发现,没有执行,则需要检查接口是否为原始类所implements的接口
也算是一点小坑吧
无法通过getBean()
这个是在总结获取不了增强类时发现的,给自己打个预防针
在获取对象时,由于已经做了组装好切点和指定好切面方法,所以Spring获取的应该是代理对象而非原始对象所以在业务中使用原始对象获取Bean肯定会出问题
具体如下
业务代码B
@Test
public void test2() {
ApplicationContext context=new ClassPathXmlApplicationContext("/ApplicationContext2.XML");
UserServiceImpl userService= (UserServiceImpl) context.getBean("UserServicePiont");
userService.login("SY", "123456");
userService.register(new User());
}
从之前的代码可以知道UserServiceImpl是原始代码
我尝试执行下出如下结果
java.lang.ClassCastException: com.sun.proxy.$Proxy6 cannot be cast to org.Service.UserServiceImpl
说com.sun.proxy.$Proxy6不能变为org.Service.UserServiceImpl
由此看出spring代理的对象早已不是原来的对象了
在搜索了其他人的分析发现
aop切面插入后该bean被jdk内部自动转为了com.sun.proxy.$Proxy25类型类型已被转变,所以无法通过类UserServiceImpl进行获取
那么如何获取后如何执行该类的代理方法呢?
很简单 使用原始类所implements的接口即可如上面业务代码A那样即可
有人问获取后如何执行该原始类的方法呢?
好像使用反射可以达到目的,在此不再研究,具体生产环境遇到再说,继续学习。
Spring AOP获取不了增强类(额外方法)或无法通过getBean()获取对象的更多相关文章
- Spring AOP切面变成——创建增强类
说明 Spring使用增强类定义横向逻辑,同时Spring只支持方法连接点,增量类还包含在方法的哪一点添加横切代码的方位信息.所以增强既包含横向逻辑,又包含部分连接点的信息. 类型 按着增强在目标类方 ...
- Spring学习(七)——增强类
Spring 切点 什么是切点?切点(Pointcut),每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物.但在这为数从多的连接点中,如何定位 ...
- (精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置)
Spring的核心框架主要包含两个技术,分别用来处理工厂类,以及事务处理和连接管理的. 两大核心概念 1) IoC:控制反转,在现在的开发中,如果想建立对象并设置属性,是需要先new对象,再通过se ...
- Spring AOP中使用args表达式访问目标方法的参数
Spring AOP 的使用过程理解 首先,aop的使用场景介绍: 1.处理一些通用的非功能性的需求,不影响业务流程,比如说打印日志.性能统计.推送消息等: 2.aop无法拦截static.final ...
- 工作随笔——Java调用Groovy类的方法、传递参数和获取返回值
接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码 ...
- vue.js 父组件主动获取子组件的数据和方法、子组件主动获取父组件的数据和方法
父组件主动获取子组件的数据和方法 1.调用子组件的时候 定义一个ref <headerchild ref="headerChild"></headerchild& ...
- SpringMVC + Spring + MyBatis 学习笔记:在类和方法上都使用RequestMapping如何访问
系统:WIN8.1 数据库:Oracle 11GR2 开发工具:MyEclipse 8.6 框架:Spring3.2.9.SpringMVC3.2.9.MyBatis3.2.8 先看代码: @Requ ...
- Spring MVC中如何指定某个类或方法自适配地响应某个HTTP请求?
方法已经找到,即调用AbstractHandlerMethodAdapter.handle() public final ModelAndView handle(HttpServletRequest ...
- spring aop获取目标对象的方法对象(包括方法上的注解)
这两天在学习权限控制模块.以前看过传智播客黎活明老师的巴巴运动网视频教程,里面就讲到权限控制的解决方案,当时也只是看看视频,没有动手实践,虽说看过几遍,可是对于系统中的权限控制还是很迷茫,所以借着这次 ...
随机推荐
- ES 终于可以搜到”悟空哥“了!
Elasticsearch 搜索引擎内置了很多种分词器,但是对中文分词不友好,所以我们需要借助第三方中文分词工具包. 悟空哥专门研究了下 ik 中文分词工具包该怎么玩,希望对大家有所帮助. 本文主要内 ...
- .net 预处理指令符的使用
目录 什么是预处理指令符? 预处理指令符的使用 自定义指令符 使用Visual Studio快速定义指令符 定义指令符区域 什么是预处理指令符? 当C#编译器找到一条预处理指令#if,最后找到一条指令 ...
- SpringBoot-13 Dubbo实战
SpringBoot-13 Dubbo实战 前提: 已经准备好Dubbo-admin和Zookeeper 前置准备 1.创建项目 显示创建一个Empty Project,创建两个Module---&g ...
- 使用 EPPlus 封装的 excel 表格导入功能 (.net core c#)
使用 EPPlus 封装的 excel 表格导入功能 前言 最近做系统的时候有很多 excel导入 的功能,以前我前后端都做的时候是在前端解析,然后再做个批量插入的接口 我觉着这样挺好的,后端部分可以 ...
- OO_Unit2总结
OO_Unit2总结 (1) 多线程协同控制设计策略 总体信号通讯策略 本单元作业,我采用的是生产者-消费者模式加类观察者模式. 通过分析指导书给出的需求,我将最终我要实现的程序简化为了"输 ...
- java面试系列<2>——java容器
1.概览 容器主要包括Collection和Map两种,Collection存储着对象的集合,而map存储着键值对(两个对象)的映射表 Collection 1.set TreeSet:基于红黑树实现 ...
- Maven相关知识总结
目录 认识Maven Maven下载安装 Maven能用来做什么 Maven核心概念 开发目录 坐标和仓库 POM文件 POM文件内容 Maven依赖管理 构建生命周期 构建多模块系统 聚合 继承 聚 ...
- HUAWEI AppGallery Connect 正式发布移动端App,随时随地掌握应用动态
华为应用市场AppGallery Connect应用一站式服务平台正式发布移动端App,帮助您随时随地查看应用信息,获取运营分析数据,接收重要消息通知,快速回复用户评论等,提升应用的运营管理效率,更便 ...
- Day15_86_通过反射机制获取所有方法(method)
通过反射机制获取所有方法(method) import java.lang.reflect.Field; import java.lang.reflect.Method; import java.la ...
- Python表达式进阶——列表表达式
x = 0 y = x*2 if x >= 0 else x print(y) # [表达式for变量in列表] l1 = [] l2 = [i for i in range(100) if i ...