9

私はコードをもっている:

@Configuration
public class BeanSample {

    @Bean(destroyMethod = "stop")
    public SomeBean someBean() throws Exception {
        return new SomeBean("somebean name1");
    }


    class SomeBean {

        String name;

        public SomeBean(String name) {
            this.name = name;
        }

        public void stop() {
            System.out.println("stop");
        }
    }

    public static void main(String[] args) throws Exception {

        BeanSample beanSample = new BeanSample();
        SomeBean someBean1 = beanSample.someBean();

        ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
                new String[] {"appContext.xml"});

        SomeBean someBean2 = (SomeBean) appContext.getBean("someBean");

        if (someBean1 == someBean2) System.out.println("OK");

    }
}

アプリを起動すると、BeanSample.getSomeBean() を実行すると、「someBean」によって SomeBean が利用できるようになると期待しています。

Bu 今、私はエラーがあります: 'someBean' という名前の Bean が定義されていません

実際、Bean を取得するためにどのアプリ コンテキストを使用すればよいかわかりません。

@Configuration について:

ここで @Configuration アノテーションを使用する必要がある理由は何ですか? (これを使用すると、私の IDE は当時の Spring 関連のクラスを強調表示するので、理にかなっているはずです)

-- OK: 回答を得た後、コードは次のようになります。

 public static void main(String[] args) throws Exception {

        AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(BeanSample.class);

        SomeBean someBean2 = (SomeBean) appContext.getBean("someBean");

        if (someBean2 != null) System.out.println("OK");

    }
4

3 に答える 3

7

まず、Java 構成を使用する場合は、次のようにコンテキストをインスタンス化する必要があります。

new AnnotationConfigApplicationContext(BeanSample.class)

第 2 に、@Configurationアノテーションは、アノテーションが付けられたクラスから Bean を作成しません。メソッドのみが@BeanBean の作成に使用されます。

Bean も必要な場合は、BeanSampleBean を作成する別の@Beanメソッドを作成する必要があります。しかし、繰り返しになりますが、なぜそれが必要なのですか?クラスは構成コンテナー@Configurationとしてのみ使用する必要があり、他の目的では使用しないでください。

3 番目に、 のデフォルトの Bean 名は@Bean、プロパティ ゲッターの規則に従っていません。メソッド名は直接使用されます。つまり、あなたの例では、Bean には名前が付けられgetSomeBeansomeBean. メソッドを次のように変更します。

@Bean(destroyMethod = "stop")
public SomeBean someBean() throws Exception {
    return new SomeBean("somebean name1");
}

最後に、@Configurationクラスをインスタンス化しないでください。そのメソッドは、Bean を作成する目的のみに役立ちます。次に、Spring がライフサイクルを処理し、プロパティを注入します。対照的に、クラスをインスタンス化してメソッドを直接呼び出すと、返されるオブジェクトは、Spring とは関係のない通常のオブジェクトになります。

于 2012-10-11T16:25:27.530 に答える
6

によって生産された豆

@Bean
public SomeBean getSomeBean() 

デフォルトの名前が付けられます -- これがプロデューサー メソッドの名前ですgetSomeBean

だからあなたは2つのことをすることができます

@Bean
public SomeBean getSomeBean() {...}   
...
SomeBean bean = (SomeBean) appContext.getBean("getSomeBean");
if (bean != null) System.out.println("OK");

また

@Bean(name="someBean")
public SomeBean getSomeBean() {...}  
...
SomeBean bean = (SomeBean) appContext.getBean("someBean");
if (bean != null) System.out.println("OK");

代わりに使用した完全な例AnnotationConfigApplicationContextClassPathXmlApplicationContext

import java.util.Arrays;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanSample {

    @Bean(name="someBean")
    public SomeBean getSomeBean() throws Exception {
        return new SomeBean("somebean name1");
    }

    class SomeBean {

        String name;

        public SomeBean(final String name) {
            this.name = name;
        }

        public void stop() {
            System.out.println("stop");
        }
    }

    public static void main(final String[] args) throws Exception {

        AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(BeanSample.class);

        BeanSample beanSample = (BeanSample) appContext.getBean("beanSample");

        //next time use this to have a look at the beans in the context!
        System.out.println(Arrays.toString(appContext.getBeanDefinitionNames()));

        SomeBean bean = (SomeBean) appContext.getBean("someBean");
        if (bean != null) System.out.println("OK");

    }
}

出力:

[org.springframework.context.annotation.internalConfigurationAnnotationProcessor、org.springframework.context.annotation.internalAutowiredAnnotationProcessor、org.springframework.context.annotation.internalRequiredAnnotationProcessor、org.springframework.context.annotation.internalCommonAnnotationProcessor、org.springframework.context.annotation.internalPersistenceAnnotationProcessor 、beanSample、org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0、someBean] OK

于 2012-10-11T16:35:25.160 に答える
4

テストは、@ConfigurationBean構成で次のようになります(以前はコンテキストxmlファイルを使用して定義していたものが、@ Configuration Javaコードを使用して定義されるようになりました)

これにより、Bean構成を提供するBeanSampleを使用してアプリケーションコンテキストが作成されます。

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BeanSample.class);

今、あなたの@Configuration

@Bean
public SomeBean someBean() throws Exception {
    return new SomeBean("somebean name1");
}

Bean名はメソッド名です。したがって、メソッド名の上には「someBean」があります。この場合、Bean名は「getSomeBean」になります。

したがって、Beanを検索するには、次のことを行う必要があります。

SomeBean bean = appContext.getBean("someBean", SomeBean.class);
于 2012-10-11T16:30:13.583 に答える