1 0

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

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

@Component
public class Bean {
	String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
}

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

 

<aop:pointcut expression="execution(* com..*Bean.*(..))"
			id="txBean" />

 现在对它进行测试:

 

public class BeanTest extends SpringContextTestCase{
	@Autowired
	private Bean bean;
	@Test
	public void testBean(){
		bean.setName("dylan");
		System.out.println(bean.name);
		System.out.println(bean.getName());
	}
}

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

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

2012年9月14日 13:34

1个答案 按时间排序 按投票排序

0 0

采纳的答案

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


import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.core.annotation.Order;

@Aspect
@Order(Integer.MIN_VALUE)
public class SetterAspect {
    
    @After(value="execution(* *.set*(*)) && args(value)", argNames="value")
    public void after(JoinPoint jp, Object value) {
        Object proxy = jp.getThis();
        Object target = jp.getTarget();
        
        if(AopUtils.isAopProxy(proxy)) {//只有代理对象才需要处理
            
            try {
                Class<?> proxyClass = proxy.getClass();
                Class<?> targetClass = target.getClass();
                String methodName = jp.getSignature().getName();
                
                Method m = BeanUtils.findDeclaredMethod(proxyClass, methodName, new Class[]{value.getClass()});
                PropertyDescriptor descriptor = BeanUtils.findPropertyForMethod(m);
                String propName = descriptor.getName();
                
                Field f = targetClass.getClass().getDeclaredField(propName);
                if(f != null) {
                    f.setAccessible(true);
                    f.set(proxy, value);
                }
            } catch (Exception e) {
                e.printStackTrace();//记录好异常进行处理
            }
        }
    }

}

2012年9月14日 17:05

相关推荐

    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