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

如何为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 杂谈,求扩散

    11. **设置代理类属性**:为Spring代理类设置属性值可以通过ApplicationContext的getBean方法或Autowired注解完成。对于非代理对象,可以直接注入;对于代理对象,可能需要通过特定方式如@Autowired注解配合@...

    利用反射和代理实现简单的Spring

    静态代理是在编译时期就确定了代理类,需要为每个被代理的目标类手动创建一个代理类。而动态代理则是在运行时生成代理类,这通常是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现...

    spring杂谈 作者zhang KaiTao

    作者提供了一个工具类来帮助开发者处理这个问题,同时介绍了如何为Spring的代理类设置属性值。 Spring对Bean Validation规范的集成使得方法级别的验证成为可能,增强了业务逻辑的健壮性。此外,作者还总结了Spring...

    在自定义spring aop中使用el获取拦截方法的变量值。

    JDK代理用于接口实现类,而CGLIB代理用于无接口或非代理类。 EL是JavaServer Faces (JSF) 和其他Java技术中用于在视图层解析表达式并获取数据的工具,它允许在运行时评估Java表达式,例如获取Bean属性、方法调用等...

    springioc和spring aop

    Spring通过反射机制来实现这一过程,比如在上述的`TestIOC`例子中,Spring能够根据类名动态地创建对象,并通过setter方法注入属性值,实现了对象的实例化和配置。 **依赖注入(DI)**有多种实现方式,包括构造器...

    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 Bean生命周期.pdf

    属性赋值阶段,Spring容器会将Bean定义中配置的属性值设置到Bean实例上。在这个过程中,容器会考虑属性值的依赖关系,并按需注入其他Bean或设置具体的值。 3. 初始化(Initialization) 初始化阶段是指Bean已经实例...

    spring 中特殊bean用法

    我们可以使用SpEL在配置文件中进行复杂的逻辑判断,或者在Bean属性中注入动态值。 5. **条件注解**: Spring提供了`@Conditional`注解,允许我们在特定条件下注册Bean。这在实现模块化和按需加载功能时非常有用。...

    简易实现Spring流程代码

    1. XML配置:Spring最初是以XML配置为主,开发者会在`beans.xml`文件中定义bean的定义,包括bean的类名、属性值、依赖关系等。XML配置提供了良好的可读性和灵活性,但随着项目复杂度增加,维护成本会提高。 2. Java...

    spring杂谈

    11. **设置代理类属性值**:通过Spring的代理机制,可以在运行时为代理类设置属性值,以满足特定的需求。 12. **SpringDAO层支持**:Spring提供了DAO层的支持,包括JdbcTemplate、HibernateTemplate等,帮助简化...

    用反射的方式获取父类中的所有属性和方法

    一旦我们有了`Method`或`Field`对象,就可以在运行时动态地调用方法或设置/获取属性值: ```java Object obj = ...; // 父类实例 method.invoke(obj, parameters); // 调用方法,parameters是参数数组 field....

    struts spring集成【下】

    在这里,`class`属性值应替换为Spring管理的bean的ID,例如`com.example.MyAction`。 4. **事务管理**:在Spring中,我们可以使用`PlatformTransactionManager`接口来管理事务。在上述提到的`applicationContext....

    Spring2.0中文教程

    它可以用于配置文件中的属性值绑定,以及AOP切点表达式。 10. **Spring AOP代理** Spring 2.0提供了两种AOP代理:JDK动态代理和CGLIB代理。JDK代理用于接口实现类,而CGLIB代理则用于没有接口或不希望修改接口的类...

    Spring源码

    8. **Spring表达式语言(SpEL)**:Spring Expression Language用于在运行时查询和操纵对象图,常用于配置文件中的条件判断和属性值设置。 9. **Spring AOP代理**:Spring使用两种类型的代理,即JDK动态代理和CGLIB...

    最新版本的spring

    3. **类型安全的属性注入**:通过@Value注解,开发者可以直接在bean中注入属性值,而这些值可以从属性文件中读取,提供了类型安全的检查。 4. **简化AOP**:Spring 3.1.0对AspectJ的集成进行了优化,使切面编程更加...

    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经典绝对值得看

    6. **Spring Boot**:虽然标题中没有提及Spring Boot,但它是Spring生态中的重要组成部分,简化了Spring应用程序的初始设置。Spring Boot的自动配置也是基于反射,它可以自动识别类路径中的某些配置类,并根据它们...

    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源代码解析(六):Spring声明式事务处理.doc

    1. 对在上下文中配置的属性的处理,这里涉及的类是 TransactionAttributeSourceAdvisor,这是一个通知器,用它来对属性值进行处理,属性信息放在 TransactionAttribute 中来使用,而这些属性的处理往往是和对切入点...

Global site tag (gtag.js) - Google Analytics