是否可以在使用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
干杯。
答案 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());
}