在问答频道 有朋友问《如何为spring代理类设置属性值》 就写了个小工具 供使用。思想就不讲了。
现在有一个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"呢
默认是没有办法的。我帮你写了个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();//记录好异常进行处理
- }
- }
- }
- }
相关推荐
11. **设置代理类属性**:为Spring代理类设置属性值可以通过ApplicationContext的getBean方法或Autowired注解完成。对于非代理对象,可以直接注入;对于代理对象,可能需要通过特定方式如@Autowired注解配合@...
静态代理是在编译时期就确定了代理类,需要为每个被代理的目标类手动创建一个代理类。而动态代理则是在运行时生成代理类,这通常是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现...
作者提供了一个工具类来帮助开发者处理这个问题,同时介绍了如何为Spring的代理类设置属性值。 Spring对Bean Validation规范的集成使得方法级别的验证成为可能,增强了业务逻辑的健壮性。此外,作者还总结了Spring...
JDK代理用于接口实现类,而CGLIB代理用于无接口或非代理类。 EL是JavaServer Faces (JSF) 和其他Java技术中用于在视图层解析表达式并获取数据的工具,它允许在运行时评估Java表达式,例如获取Bean属性、方法调用等...
Spring通过反射机制来实现这一过程,比如在上述的`TestIOC`例子中,Spring能够根据类名动态地创建对象,并通过setter方法注入属性值,实现了对象的实例化和配置。 **依赖注入(DI)**有多种实现方式,包括构造器...
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定义中配置的属性值设置到Bean实例上。在这个过程中,容器会考虑属性值的依赖关系,并按需注入其他Bean或设置具体的值。 3. 初始化(Initialization) 初始化阶段是指Bean已经实例...
我们可以使用SpEL在配置文件中进行复杂的逻辑判断,或者在Bean属性中注入动态值。 5. **条件注解**: Spring提供了`@Conditional`注解,允许我们在特定条件下注册Bean。这在实现模块化和按需加载功能时非常有用。...
1. XML配置:Spring最初是以XML配置为主,开发者会在`beans.xml`文件中定义bean的定义,包括bean的类名、属性值、依赖关系等。XML配置提供了良好的可读性和灵活性,但随着项目复杂度增加,维护成本会提高。 2. Java...
11. **设置代理类属性值**:通过Spring的代理机制,可以在运行时为代理类设置属性值,以满足特定的需求。 12. **SpringDAO层支持**:Spring提供了DAO层的支持,包括JdbcTemplate、HibernateTemplate等,帮助简化...
一旦我们有了`Method`或`Field`对象,就可以在运行时动态地调用方法或设置/获取属性值: ```java Object obj = ...; // 父类实例 method.invoke(obj, parameters); // 调用方法,parameters是参数数组 field....
在这里,`class`属性值应替换为Spring管理的bean的ID,例如`com.example.MyAction`。 4. **事务管理**:在Spring中,我们可以使用`PlatformTransactionManager`接口来管理事务。在上述提到的`applicationContext....
它可以用于配置文件中的属性值绑定,以及AOP切点表达式。 10. **Spring AOP代理** Spring 2.0提供了两种AOP代理:JDK动态代理和CGLIB代理。JDK代理用于接口实现类,而CGLIB代理则用于没有接口或不希望修改接口的类...
8. **Spring表达式语言(SpEL)**:Spring Expression Language用于在运行时查询和操纵对象图,常用于配置文件中的条件判断和属性值设置。 9. **Spring AOP代理**:Spring使用两种类型的代理,即JDK动态代理和CGLIB...
3. **类型安全的属性注入**:通过@Value注解,开发者可以直接在bean中注入属性值,而这些值可以从属性文件中读取,提供了类型安全的检查。 4. **简化AOP**:Spring 3.1.0对AspectJ的集成进行了优化,使切面编程更加...
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. @...
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支持 ...
6. **Spring Boot**:虽然标题中没有提及Spring Boot,但它是Spring生态中的重要组成部分,简化了Spring应用程序的初始设置。Spring Boot的自动配置也是基于反射,它可以自动识别类路径中的某些配置类,并根据它们...
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支持 ...
1. 对在上下文中配置的属性的处理,这里涉及的类是 TransactionAttributeSourceAdvisor,这是一个通知器,用它来对属性值进行处理,属性信息放在 TransactionAttribute 中来使用,而这些属性的处理往往是和对切入点...