我有一个代码:

@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”提供。

但是现在我有一个错误:没有定义名为“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");

    }

最佳答案

首先,如果使用Java配置,则必须实例化上下文,如下所示:

new AnnotationConfigApplicationContext(BeanSample.class)

其次,@Configuration批注不会使带有注释的类中的bean脱颖而出。仅@Bean方法用于创建bean。

如果您也想拥有一个BeanSample bean,则必须创建另一个创建它的@Bean方法。但是话又说回来,你为什么要那样?我认为@Configuration类应仅用作配置容器,而不能用于其他任何东西。

第三,@Bean的默认bean名称不遵循属性getter的约定。方法名称直接使用,这意味着在您的示例中,bean将被命名为getSomeBean而不是someBean。将方法更改为此:
@Bean(destroyMethod = "stop")
public SomeBean someBean() throws Exception {
    return new SomeBean("somebean name1");
}

最后,不应实例化@Configuration类。它的方法仅用于创建bean。然后,Spring将处理其生命周期,注入(inject)属性等。相反,如果实例化该类并直接调用方法,则返回的对象将只是与Spring无关的普通对象。

10-05 23:16