@Bean内部类带有@Configuration,没有它

@Bean在Spring 3.0中有一个注释。它允许直接在Java代码中定义Spring

bean。在浏览Spring参考时,我发现了使用此批注的两种不同方法-带注释的内部类@Configuration和没有此注释的内部类。

本节包含以下代码:

@Component

public class FactoryMethodComponent {

@Bean @Qualifier("public")

public TestBean publicInstance() {

return new TestBean("publicInstance");

}

// omitted irrelevant method

}

在这里我们可以看到一段非常相似的代码,但是现在@Configuration就在这里:

@Configuration

public 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

回到顶部