2013-08-21 2 views
5

私は、コンストラクタの呼び出しによってインスタンス化されるクラス(クラスABC)を持っています。クラスABCは、自動配線を使用して注入されたヘルパークラス(クラスXYZ)を有する。バネの自動ワイヤリングが非スプリングの管理対象クラスから動作しない

私たちはSpring MVCベースのアプリケーションであり、サーバーの起動時に例外はありません。

でも、私はまだClass XYZがnullとして表示されています。クラスABCがSpring Containerによってインスタンス化されていないためですか?

このようなシナリオでは、自動配線をどのように使用しますか?

ありがとうございました。

+0

私はあなたが他のいくつかの平均値によりXYZのインスタンスの参照のホールドを取得する必要があります..あなたは春で管理されていない豆をAutowireすることはできません確信しています。ヘルパークラスの場合は、XYZのメソッドを静的にし、クラス名を使用してそれらを使用します。それが私のしたことです。 – dharam

+0

https://github.com/ahmedbhaila/non-managed-beansを参照してください、私は試して、それが動作します。 – Sam

答えて

2

正しい:クラスにnewを呼び出すだけで、すべての接続が完了することはありません。 Springはすべての魔法を実行するためにBeanを管理しなければなりません。

あなたのユースケースに関する詳細を投稿できる場合は、便利なオプションを提案することができます。

1

要するに、SpringがABCを管理していないため、ABCはXYZを注入されていません。 Springは、知らないオブジェクトを設定することはできません。

ABCを@Serviceまたは@Componentと注釈を付けて管理できます。春は、これらの注釈に拾うようにするために、春には、自動スキャンがオンになっていなければならないことに注意してください:

<context:component-scan base-package="com.mypackage.awesomeproject" /> 
5

クラスABCは春で管理されていないので、オートワイヤリングが動作しません。 @Customerアノテーション(@Component、@Service、@Controllerなど)をクラス定義の上に使用し、アプリケーションコンテキストXMLでcontext:component-scanを使用するか、古い学校に移動してABCを管理できるようにすることができますアプリケーションコンテキストでBeanを直接定義するだけです。

のApplicationContextコンテキスト=新しい ClassPathXmlApplicationContext(「パス/ /のApplicationContextへ:何らかの理由で、春には、クラスABCの管理を行うことができない場合

は、あなたは次のようなものを使用してABCでのアプリケーション・コンテキストをロードすることができます。 xml ");

、その後は使用:

XYZ someXyz =(XYZ)context.getBean( "MyXYZ")。

手動でBean値を設定します。

0

を使用することができると思います。その後、Spring IOCはXYZインスタンスをABCクラスに注入します。通常、AspectJ AnnotationBeanConfigurerAspectで使用されます。

+1

私のために働かなかった。 – mafonya

10

あなたは今、あなたがgetApplicationContext(でのApplicationContextオブジェクトを取得することができます

public class ApplicationContextUtils implements ApplicationContextAware { 

    private static ApplicationContext ctx; 

    @Override 
    public void setApplicationContext(ApplicationContext appContext) 
     throws BeansException { 
    ctx = appContext; 

    } 

    public static ApplicationContext getApplicationContext() { 
    return ctx; 
    } 
} 

非春のBeanクラスでのSpring Beanを使用するには、この方法を使用することができます)この方法。あなたはこのような春のBeanオブジェクトを取得することができてApplicationContextから

ApplicationContext appCtx = ApplicationContextUtils 
    .getApplicationContext(); 
String strFromContext = (String) appCtx.getBean(beanName); 
+0

appContextの設定方法は? – CrazyJavaLearner

+0

Springコンテナがそのオブジェクトを挿入します。 –

+0

はい。わかった。返信ありがとう。 – CrazyJavaLearner

2

あなたは他のBeanをautowireするクラスにSpringの@Configurableアノテーションを使用することができます。 さらに、コンフィグレーションBeanに@EnableSpringConfiguredというアノテーションを付けて、Springが設定可能なBeanを認識できるようにする必要があります。

@EnableSpringConfigured documentation

公衆@interfaceは をEnableSpringConfiguredスプリングビーンファクトリー(@Configurableアノテーションを付け、通常、クラス)の外にインスタンス化された非管理クラスに依存性注入を適用するために、現在のアプリケーション・コンテキストに信号を送ります。 SpringのXML要素にある機能に似ています。 @EnableLoadTimeWeavingと組み合わせて使用​​されることがよくあります。

@Configurable(autowire = Autowire.BY_TYPE) 
public class ABC { 
    @Autowire private XYZ xyz; 
    ... 
} 

@Configuration 
@EnableSpringConfigured 
public class Application { 
    ... 
} 

public class MyClass { 
    public void doSomething() { 
     ABC abc = new ABC(); // XYZ is successfully autowired 
     ... 
    } 
} 
+0

こんにちはibai、 MyClassとは何ですか?これは、非スプリングの管理オブジェクトです。 ApplicationクラスのABC()を新しくできますか? ありがとうございます。 – Sam

関連する問題