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スプリングでアノテーションを処理できるようにする代替手段はありますか?

- 編集: -

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' operator でインスタンス化されたオブジェクト) と、(readResolve() などを介して) 逆シリアル化中の Serializable オブジェクトを指します。

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

乾杯。

4

3 に答える 3

6

あなたは絶対に正しいです.AspectJインフラストラクチャが整っていると仮定すると、@AutowiredフィールドはSpringコンテナーの外部でも注釈付きのクラスに配線されます。@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演算子を使用してスプリングにプロパティを自動配線するように依頼することはできないと思います。applicationContextこれを解決する 1 つの方法は、静的参照を取得してプロトタイプ スコープ 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 に答える