Spring AOP开发时如何得到某个方法内调用的方法的代理对象?
Spring AOP开发时如何得到某个方法内调用的方法的代理对象?
问题阅读起来拗口,看代码
在方法中调用其他方法很常见,也经常使用,如果在一个方法内部调用其他方法,比如
public class UserServiceImpl implements UserService{
@Override
public void register(User user) {
System.out.println("rg.Service.UserServiceImpl.register");
this.login("SY","45452");
}
@Override
public Boolean login(String name, String password) {
System.out.println("rg.Service.UserServiceImpl.login "+name+" "+password );
return true;
}
}
我在这里调用了register中调用了login方法,那么我能获得login()这个被代理过的方法吗?
这是执行的代理方法
对所有login都执行代理
@Aspect
public class MyAspect {
@Around("execution(* login(..))")
public Object ServiceAspect(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("MyAspect.ServiceAspect");
Object ret=joinPoint.proceed();
return ret;
}
}
Spring配置文件,声明下类
<bean id="ExMethod" class="org.ExMerhod.UserServiceImpl"/>
如果得到了login()这个被代理过的方法会打印出MyAspect.ServiceAspect
执行下测试
public class TestExMethod {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("/ApplicationContext2.XML");
UserService userService= (UserService) context.getBean("ExMethod");
userService.login("SY","1223456");
userService.register(new User());
}
}
结果

我们只看到了rg.Service.UserServiceImpl.login的方法被代理,并没有看到我们在register中的方法被代理
这就时是问题所在
从测试中的工厂得到的ExMethod的是被代理过的方法,而在代理过的方法内的方法是被调用的那个类的方法,而不是代理过的方法,所以不会被执行增强方法。

所以我们需要让这个方法得到代理的对象即可
由于Spring工厂是一个超级重量级资源,所以我们使用ApplicationContextAware获得已经创建的工厂
具体代码如下
package org.ExMerhod;
import org.User;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class UserServiceImpl implements UserService,ApplicationContextAware{
private ApplicationContext contextAware;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.contextAware= applicationContext;
}
@Override
public void register(User user) {
System.out.println("rg.Service.UserServiceImpl.register");
//注意,方法得到了工厂的创建的对象
UserService userService= (UserService) contextAware.getBean("ExMethod");
userService.login("SY","45452");
}
@Override
public Boolean login(String name, String password) {
System.out.println("rg.Service.UserServiceImpl.login "+name+" "+password );
return true;
}
}
这次我们从工厂获得了代理对象再执行一次试试

可以看到,方法中的方法被代理了,问题也就解决了
Spring AOP开发时如何得到某个方法内调用的方法的代理对象?的更多相关文章
- Spring AOP开发
--------------------siwuxie095 Spring AOP 开发 1.在 Spring 中进行 ...
- VS2010 F5调试时出现:“ 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常”解决
VS2010 F5调试时出现 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常 两个解决方法:1) 打开项目属性,选择调试选项卡,将“启用非托管代码调试”一项钩上.2) 打开项目属性,选择调试选 ...
- [C#解惑] #1 在构造函数内调用虚方法
谜题 在C#中,用virtual关键字修饰的方法(属性.事件)称为虚方法(属性.事件),表示该方法可以由派生类重写(override).虚方法是.NET中的重要概念,可以说在某种程度上,虚方法使得多态 ...
- JavaSE复习日记 : 方法的调用和方法的重载
/* * 方法的调用和方法重载 */ /* * 什么是方法? * 方法就是一个有名字的代码段; * 方法的调用: * 在方法里调用另外一个方法里面的东西就是方法调用; * 或者可以认为"另外 ...
- __new__方法首先调用并返回一个实例化对象
>>> class CapStr(str): def __new__(cls,string): string = string.upper() return str.__new__( ...
- 微信小程序填坑,wx.request() 内调用setData()方法错误的解决办法
再方法内添加一行代码,把this对象赋值给给一个变量供success()方法内调用 核心代码: var v = this.txt; 完整示例 abc:function(e){//该函数用于和后台交互 ...
- spring aop开发常见错误
1. Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreExcepti ...
- 微信jsSDK公众号开发时网页提示 invalid signature错误的解决方法
微信公众号开发jsSDK,链接地址不能加?参数,可以通过#传递参数. 不然.页面wx.ready()时就会报错,用 wx.error(function (res) { alert("接口验证 ...
- 做一个合格的程序员之浅析Spring AOP源代码(十八) Spring AOP开发大作战源代码解析
事实上上一篇文章价值非常小,也有反复造轮子的嫌疑,网上AOP的实例非常多,不胜枚举,事实上我要说的并非这个,我想要说的就是上一节中spring的配置文件: 我们这边并没实用到我们上几节分析的哪几个AO ...
随机推荐
- 观世音甘泉活树的故事竟然是Java设计模式:备忘录模式
目录 定义 意图 主要解决问题 何时使用 优缺点 结构 白箱实现 黑箱实现 多重检查点 观世音甘泉活树的故事 定义 备忘录模式是对象的行为型模式,备忘录对象是一个用来存储另外一个对象内部状态的快照的对 ...
- 前端进阶(1)Web前端性能优化
前端进阶(1)Web前端性能优化 Web前端性能优化, 不仅能够改善站点的用户体验,并且能够节省相当的资源利用.下面将从1)服务器.2)html内容.3)css. 4)javascript. 5)图片 ...
- Throwing cards away I UVA - 10935
Given is an ordered deck of n cards numbered 1 to n with card 1 at the top and card n at the botto ...
- 1035 Password
To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...
- 9.while循环
while 循环 语法: while( 布尔表达式 ) { //循环内容 } 布尔值为 true 开始循环,为 false 结束循环 死循环:布尔值一直为 true. 例: package com.w ...
- 01- QTP快速入门
QTP概述 QTP安装流程
- POJ2446 模板盖格子 简单二分匹配
题意: 给你一个n*m的格子,有的格子上有坑,然后让你用1*2的东西去覆盖所有没有坑的格子,不能重叠,坑上也不能放东西覆盖,问是否能成功. 思路: 简单题目,每个格子和四周的 ...
- pr恢复工作区
当工作区操作的位置很乱时 平时如果关闭的窗口,可以在窗口中查看 也可以选择新建工作区,保存成一个自己所需工作区
- FileItem的部分方法解释
FileItem的部分方法: boolean isFormField() isFormField() 方法用来判断FileItem对象里面封装的数据是一个普通文本表单字段,还是一个文件表单字段.如果是 ...
- idea插件手动安装
更多精彩: 例如安装Grep Console 插件 把刚才解压的文件放到 plugins 重启idea 自定义设计