@Bean内部类带有@Configuration,没有它
@Bean
在Spring 3.0中有一个注释。它允许直接在Java代码中定义Spring
bean。在浏览Spring参考时,我发现了使用此批注的两种不同方法-带注释的内部类@Configuration
和没有此注释的内部类。
本节包含以下代码:
@Componentpublic class FactoryMethodComponent {
@Bean @Qualifier("public")
public TestBean publicInstance() {
return new TestBean("publicInstance");
}
// omitted irrelevant method
}
在这里我们可以看到一段非常相似的代码,但是现在@Configuration
就在这里:
@Configurationpublic class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
参考的前一部分包含以下说明:
Spring组件中的@Bean方法的处理方式与Spring @Configuration类中的@Bean方法不同。
区别在于,使用CGLIB不能增强@Component类,以拦截方法和字段的调用。CGLIB代理是调用@Configuration类@Bean方法中的方法或字段来创建Bean元数据引用以协作对象的方法。方法不是使用常规Java语义调用的。相反,在@Component类中的方法或字段@Bean方法具有标准的Java语义。
但是CGLIB是一种内部的东西,应用程序开发人员不应该知道(当然,在理想的世界中)。据我了解,在这两种情况下,Spring都会调用带有注解的方法@Bean
来创建Spring
bean,在这两种情况下,这些实例都会注入到协作者中。
所以我的问题是 有 ?
回答:
区别在于,@Configuration
您可以@Bean
从另一个方法调用一个方法并获取完全初始化的实例,如下所示:
public class Foo { @Value("Hello, world!")
public String value;
}
@Configuration
public class Config {
@Bean
public Foo createFoo() {
Foo foo = new Foo();
System.out.println(foo.value); // Prints null - foo not initialized yet
return foo;
}
@Bean
public Bar createBar() {
Foo foo = createFoo();
System.out.println(foo.value); // Prints Hello, world! - foo have been initialized by the interceptor
return new Bar(foo);
}
}
以上是 @Bean内部类带有@Configuration,没有它 的全部内容, 来源链接: utcz.com/qa/421733.html