0

Spring に移行したい趣味のプロジェクトがあります。

例として、次のクラスがあります。

public class OtherBean {
    public void printMessage() {
        System.out.println("Message from OtherBean");
    }
}


public class InjectInMe {
    @Inject OtherBean otherBean;

    public void callMethodInOtherBean() {
        otherBean.printMessage();
    }
}

ただし、ドキュメントを読むと、Spring によって管理されるすべてのクラスに、@Component (または同様のもの) などの注釈を付けて注釈を付ける必要があります。

次のコードで実行します。

public class SpringTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.refresh();

        InjectInMe bean = context.getBean(InjectInMe.class);
        bean.callMethodInOtherBean();
    }
}

エラーが表示されます:

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [somepackage.InjectInMe] is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:371)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:968)
    at somepackage.SpringTest.main(SpringTest.java:10)

私の質問は、Spring が ApplicationContext にインスタンス化するように要求するクラスをAnnotated Config (または XML 構成) に登録しなくても管理できるようにする方法はありますか?

Guice では、クラスに注入するだけです

public class GuiceTest {
    static public class GuiceConfig extends AbstractModule {

        @Override
        protected void configure() {}

    }
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new GuiceConfig());
        InjectInMe bean = injector.getInstance(InjectInMe.class);
        bean.callMethodInOtherBean();
    }
}

出力が得られます:

Message from OtherBean

とにかくSpringをGuiceのように動作させることはできますか? @Component のようなアノテーションが付けられたクラスのパッケージを登録またはスキャンすることなく、Spring に Bean を注入させるようにするにはどうすればよいでしょうか。

この問題を解決する方法を持っている春の達人はいますか?

4

3 に答える 3

2

私の質問は、Spring が ApplicationContext にインスタンス化するように要求するクラスを Annotated Config (または XML 構成) に登録しなくても管理できるようにする方法はありますか?

いいえ、できません。これは、Spring の設計方法ではありません。Bean を暗黙的に (スキャン + アノテーションなど) または明示的に (XML Bean 定義など) 登録する必要があります。

最低限できることは次のようなものです。

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(OtherBean.class);
context.register(InjectInMe.class);
context.refresh();
于 2014-11-21T21:24:25.073 に答える
0

クラスを @Component として宣言するか、それが何であれ宣言するか、xml 定義を提供する必要があります。Bean を定義しない場合、Spring はどうすればよいかを知ることができますか? クラスのプロパティの場合、たとえば MyController にはプライベート サービス MyService があります。サービスのインスタンス化の上に @Autowired タグを配置すると、Spring はこのサーバーをコントローラーに自動的に挿入します。これは、@Inject に関するコメントが示唆しているようです。ただし、自動配線するには、そのクラスの Bean を定義する必要があります。つまり、@Component/@Controller などのアノテーション構成または xml Bean 構成のいずれかを使用する必要があります。

于 2014-11-21T18:55:19.700 に答える
0

Spring の Bean 定義を提供するには、いくつかの方法がありますApplicationContext

  1. コンポーネント スキャンを使用して、@Componentまたはそのメタ アノテーション ( 、 など) のいずれかで@Serviceタイプ@Controllerにアノテーションを付けます。
  2. <bean>XML 構成または@BeanJava 構成 (または他のタイプの明示的な構成)を定義します。
  3. a を使用して、BeanDefinitionRegistryPostProcessorに直接 Bean を登録しBeanDefinitionRegistryます。
  4. 一部のApplicationContextサブタイプは を実装BeanDefinitionRegistryしているため、Bean 定義をそれらに直接登録できます。

これらの Bean 定義から生成された Bean は、注入が必要なときに使用できます。(少なくとも IMO では) コンテナーに、何らかの方法で問題がないことを伝えることなく、型をインスタンス化することは望ましくありません。

于 2014-11-21T18:48:41.287 に答える