Spring - 使用@Configurable&创建具有new运算符的对象@Value注释

时间:2013-02-27 07:11:15

标签: java spring properties dependency-injection aspectj

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

我知道它可能与@Autowired和@Resource等......还有其他人吗?

e.g。

@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并仍然可以处理注释?

- 编辑: -

使用@Autowired 时可以使用new进行此操作,看一下Spring和AOP的一些Hibernate和JPA ...我已经在过去做一些Java代码的分析。但我真的想在我模拟一个完整的例子之前使用SPEL和@Value,我希望在这里找到答案。仅供参考 - 如果您不相信我,Spring手册甚至表示可以这样做,我想知道的是它是否可以在同一范围内使用 @Value 注释... < / p>

  

Spring容器实例化并配置你的bean中定义的bean   应用背景。也可以问豆工厂   在给定bean定义名称的情况下配置预先存在的对象   包含要应用的配置。 spring-aspects.jar   包含利用此功能的注释驱动方面   允许依赖注入任何对象。

和...

  

使用注释本身并没有任何作用。它是   Spring-aspects.jar中的AnnotationBeanConfigurerAspect作用于   存在注释。从本质上讲,这个方面是“之后的   从注释类型的新对象的初始化返回   使用@Configurable,使用Spring in配置新创建的对象   根据注释的属性“。在这种情况下,   初始化是指新实例化的对象(例如, 对象   使用'new'运算符 )以及Serializable实例化   正在进行反序列化的对象(例如,通过readResolve())。

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

干杯。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

否则

MyObj obj = new MyObj()

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

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyObj obj = context.getBean("myBean");

答案 2 :(得分:1)

我认为不可能使用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());
}