`
jinnianshilongnian
  • 浏览: 21434706 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2405078
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997748
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631488
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257577
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593183
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248974
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847568
Group-logo
跟我学Nginx+Lua开...
浏览量:698167
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780468
社区版块
存档分类
最新评论

如何为spring代理类设置属性值

 
阅读更多

 

在问答频道 有朋友问《如何为spring代理类设置属性值》 就写了个小工具 供使用。思想就不讲了。

现在有一个bean包含了私有属性,如下:

Java代码   收藏代码
  1. @Component  
  2. public class Bean {  
  3.     String name;  
  4.   
  5.     public String getName() {  
  6.         return name;  
  7.     }  
  8.   
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.       
  13. }  

它被AOP配置过代理,代理配置为:

 

Java代码   收藏代码
  1. <aop:pointcut expression="execution(* com..*Bean.*(..))"  
  2.             id="txBean" />  

 现在对它进行测试:

Java代码   收藏代码
  1. public class BeanTest extends SpringContextTestCase{  
  2.     @Autowired  
  3.     private Bean bean;  
  4.     @Test  
  5.     public void testBean(){  
  6.         bean.setName("dylan");  
  7.         System.out.println(bean.name);  
  8.         System.out.println(bean.getName());  
  9.     }  
  10. }  

 这里的测试结果中,第一个输出为null,第二个输出为dylan,

由于项目中需要直接通过bean.name的方式来获取属性值,却一直都只能得到null,请问如何才能获取到我所期望的值"dylan"呢

 

 

默认是没有办法的。我帮你写了个AOP切面 帮你完成设置属性。 

Java代码   收藏代码
  1. import java.beans.PropertyDescriptor;  
  2. import java.lang.reflect.Field;  
  3. import java.lang.reflect.Method;  
  4.   
  5. import org.aspectj.lang.JoinPoint;  
  6. import org.aspectj.lang.annotation.After;  
  7. import org.aspectj.lang.annotation.Aspect;  
  8. import org.springframework.aop.support.AopUtils;  
  9. import org.springframework.beans.BeanUtils;  
  10. import org.springframework.core.annotation.Order;  
  11.   
  12. @Aspect  
  13. @Order(Integer.MIN_VALUE)  
  14. public class SetterAspect {  
  15.       
  16.     @After(value="execution(* *.set*(*)) && args(value)", argNames="value")  
  17.     public void after(JoinPoint jp, Object value) {  
  18.         Object proxy = jp.getThis();  
  19.         Object target = jp.getTarget();  
  20.           
  21.         if(AopUtils.isAopProxy(proxy)) {//只有代理对象才需要处理  
  22.               
  23.             try {  
  24.                 Class<?> proxyClass = proxy.getClass();  
  25.                 Class<?> targetClass = target.getClass();  
  26.                 String methodName = jp.getSignature().getName();  
  27.                   
  28.                 Method m = BeanUtils.findDeclaredMethod(proxyClass, methodName, new Class[]{value.getClass()});  
  29.                 PropertyDescriptor descriptor = BeanUtils.findPropertyForMethod(m);  
  30.                 String propName = descriptor.getName();  
  31.                   
  32.                 Field f = targetClass.getClass().getDeclaredField(propName);  
  33.                 if(f != null) {  
  34.                     f.setAccessible(true);  
  35.                     f.set(proxy, value);  
  36.                 }  
  37.             } catch (Exception e) {  
  38.                 e.printStackTrace();//记录好异常进行处理  
  39.             }  
  40.         }  
  41.     }  
  42.   
  43. }  
3
2
分享到:
评论

相关推荐

    spring杂谈 作者zhang KaiTao

    1.12 如何为spring代理类设置属性值 1.13 我对SpringDAO层支持的总结 1.14 我对SpringDAO层支持的总结 1.15 我对SpringDAO层支持的总结 1.16 我对Spring 容器管理事务支持的总结 1.17 我对Spring 容器管理事务支持的...

    高级开发spring面试题和答案.pdf

    spring 三种注入(就是从spring容器中将bean放入对象属性值中) Spring下描述依赖关系@Resource, @Autowired和@Inject的区别与联系 Spring中BeanFactory和ApplicationContext的区别 谈谈Spring IOC的理解,原理与...

    spring.net中文手册在线版

    使用对象或类的属性值进行注入 4.3.5.2.使用字段值进行注入 4.3.5.3.使用方法的返回值进行注入 4.3.6.IFactoryObject接口的其它实现 4.3.6.1.Log4Net 4.3.7.使用depends-on 4.3.8.自动装配协作对象 4.3.9.检查依赖项...

    Spring 2.0 开发参考手册

    5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @...

    Spring中文帮助文档

    5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 5.4.2.1. 注册用户自定义的PropertyEditor 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 ...

    Spring API

    5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. AOP代理 6.2. @AspectJ支持 ...

    spring chm文档

    5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @...

    spring security 参考手册中文版

    12.1设置MockMvc和Spring Security 104 12.2 SecurityMockMvcRequestPostProcessors 105 12.2.1使用CSRF保护进行测试 105 12.2.2在Spring MVC测试中以用户身份运行测试 106 12.2.3使用RequestPostProcessor在Spring ...

    Spring.net框架

    t.InvokeMember(prop.propertyName, ........BindingFlags.SetProperty, null, o, new Object[] {p})利用反射机制对创建出来的对象设置属性值。 我们的Factory就是利用这种方式根据配置文件动态加载程序集,动态创建...

    Spring.3.x企业应用开发实战(完整版).part2

    5.4 引用Bean的属性值 5.5 国际化信息 5.5.1 基础知识 5.5.2 MessageSource 5.5.3 容器级的国际化信息资源 5.6 容器事件 5.6.1 Spring事件类结构 5.6.2 解构Spring事件体系的具体实现 5.6.3 一个实例 5.7 小结 第6章...

    Spring3.x企业应用开发实战(完整版) part1

    5.4 引用Bean的属性值 5.5 国际化信息 5.5.1 基础知识 5.5.2 MessageSource 5.5.3 容器级的国际化信息资源 5.6 容器事件 5.6.1 Spring事件类结构 5.6.2 解构Spring事件体系的具体实现 5.6.3 一个实例 5.7 小结 第6章...

    ssh(structs,spring,hibernate)框架中的上传下载

     第27~30行定义了Spring代理Hibernate数据操作的HibernateTemplate模板,而第32~34行将该模板注入到tfileDAO中。  需要指定的是Spring 1.2.5提供了两套Hibernate的支持包,其中Hibernate 2相关的封装类位于org....

    springboot参考指南

    在Spring环境中使用YAML暴露属性 iii. 23.6.3. Multi-profile YAML文档 iv. 23.6.4. YAML缺点 vii. 23.7. 类型安全的配置属性 i. 23.7.1. 第三方配置 ii. 23.7.2. 松散的绑定(Relaxed binding) iii. 23.7.3. @...

    基础深化和提高-java反射技术

    通过反射,程序可以在运行时检查类、实例化对象、调用方法、获取和设置属性,甚至可以动态修改类的结构。 Java反射技术的核心在于java.lang.reflect包,它提供了一系列类和接口,用于在运行时获取关于类和对象的...

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

    属性和方法 构造方法 方法重载 方法的重写 初始化 类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和...

    java面试题

    答:CORBA标准是公共对象请求代理结构,用途为:用不同的程序设计语言书写,在不同的进程中运行,为不同的操作系统开发。 xml解析技术? 答:常用的DOM、SAX等 DOM:处理大型文件时性能下降的非常厉害,适合对xml...

Global site tag (gtag.js) - Google Analytics