我有一个代码:
@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无关的普通对象。