2016-08-30 6 views
0

初心者の春の質問。私は@Componentクラスを正しく、私の環境設定をもたらす注釈があります。Plain Data Bean、自動受託Beanの呼び出し側(@Component)、NULLを参照してください。

@Component 
public class EnvConfig { 
    //... 
} 

これは@Componentなので、自動注入によってピックアップされます。

しかし、このクラスの呼び出し元はプレーンなデータbeanです。プレーン・データBeanには、このクラスにアクセスする必要のある特殊なユーティリティ・メソッドがあります。私はこの方法にデバッグするとき

public class EmployeeBean { 

    @Autowired 
    EnvConfig envConfig; 

    //... 

    public void getSpecialInfo() 
    { 
     envConfig.method1(); 
     envConfig.method2(); 
    } 
} 

envConfigはNULLです。

したがって、Autowiredオブジェクトの呼び出し元でもは@Component、@Service、または@Repositoryである必要がありますか?

答えて

3

多かれ少なかれ、はい。 Springは明らかに、それが管理するオブジェクト(つまり、 "Spring Beans")をautowireするだけです - どうすればそれを行うことができますか?したがって、オブジェクトを自分で作成した場合(new ...)、それは "春の豆"ではなく、ただのランダムなオブジェクトであり、Springはそれを制御できません。また、自動的に何かを自動配線することもできません。

これを行う1つの方法は、それらを@Componentなどにして、それらをSpringのコンポーネントスキャンで見つけることです。

Spring Beanを作成する他の方法は、JavaConfig(@Bean経由)、XML設定(<bean .../>経由)など(PreProcessors経由など、難解になり始めます)です。

もちろん、Springのアプリケーションコンテキストへの静的なアクセスを使用して、独自のオブジェクトがSpring Beansにアクセスできるようにすることもできますが、それは本当に良い方法ではありません。

+0

注釈付きクラスを '@ ComponentScan' /' 'で定義されたパッケージに配置することを忘れないでください。 –

+1

また、Spring Bootのパワーを使用して、 –

+1

しかし、制限について注意する必要があります:) AFAIK '@ SpringBootApplication'は' basePackage'パラメータなしで '@ ComponentScan'を使います。だから、「アプリケーション」を「間違った」場所(ネストされたパッケージなど)に置くことができ、アプリケーション(ルート)パッケージ全体で魔法のように動作しないかもしれません;) –

関連する問題