6

是否可以在使用 AspectJ 编织的类上使用 @Configurable 并让 Spring 加载使用 @Value 注释的字段/方法上的值?

我知道@Autowired 和@Resource 等是可能的……还有其他的吗?

例如

@Configurable
public Class MyObj{
 @Value("$(my.prop)")
 private String aField;

 public String getAField(){
   return aField;
 }
}

然后有类似的东西

public aMethodSomewhereElse(){
   MyObj obj = new MyObj()
   assertNotNull(obj.getAField());
}

有没有其他方法可以MyObj使用new操作员创建并且仍然可以让 spring 来处理注释?

- 编辑: -

new在使用 @Autowired 时可以做到这一点,看看一些带有 Spring 和 AOP 的 Hibernate 和 JPA 的东西......我过去用它来做一些 Java 代码的分析。但我真的想在模拟一个完整的例子之前使用 SPEL 和 @Value,我希望在这里找到答案。仅供参考-如果您不相信我,Spring手册甚至说可以这样做,我想知道的是是否可以在同一范围内使用@Value注释...

Spring 容器实例化和配置应用程序上下文中定义的 bean。给定包含要应用的配置的 bean 定义的名称,也可以要求 bean 工厂配置预先存在的对象。spring-aspects.jar 包含一个注释驱动的方面,它利用此功能允许对任何对象进行依赖注入。

和...

当然,单独使用注解什么也没做。作用于注解存在的是 spring-aspects.jar 中的 AnnotationBeanConfigurerAspect。本质上,该方面说“在从使用 @Configurable 注释的类型的新对象的初始化返回后,根据注释的属性使用 Spring 配置新创建的对象”。在此上下文中,初始化指的是新实例化的对象(例如,使用'new' 运算符实例化的对象)以及正在进行反序列化的可序列化对象(例如,通过 readResolve())。

http://static.springsource.org/spring/docs/3.0.0.RC2/reference/html/ch07s08.html

干杯。

4

3 回答 3

6

你是绝对正确的——假设你有一个 AspectJ 基础设施,即使在 Spring 容器之外,@Autowired字段也会被连接到一个带注释的类中。@Configurable

您已经注意到一个很好的问题,@Value字段由 Spring bean 后处理器 (AutowiredAnnotationBeanPostProcessor) 处理,它解析带@Value注释的字段。虽然它不会作用于在容器外部实例化的对象 - 所以简而言之,@Autowired 字段应该被连接,但@Value属性不会。

于 2013-02-27T13:52:47.923 回答
2

正在做

MyObj obj = new MyObj()

表示 obj 不是由 spring 管理的,所以它不会进行自动装配。唯一的方法是从应用程序上下文中获取实例。例如:

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyObj obj = context.getBean("myBean");
于 2013-02-27T07:50:56.760 回答
2

我认为不可能使用new运算符并要求 spring 自动装配属性。我认为解决这个问题的一种方法是获取一个静态引用applicationContext并创建一个原型作用域 bean。

@Component
public class ApplicationContextLocator {
    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public ApplicationContextLocator() {
        super();
    }

    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextLocator.applicationContext = applicationContext;
    }

}

@Scope(BeanDefinition.SCOPE_PROTOTYPE)
@Component
public class MyObj {
    .....
}

public aMethodSomewhereElse(){
   MyObj obj = ApplicationContextLocator.getApplicationContext().getBean(MyObj.class)
   assertNotNull(obj.getAField());
}
于 2013-02-27T08:15:20.140 回答