gpt4 book ai didi

java - @Bean 在类中使用@Configuration 和不使用它

转载 作者:搜寻专家 更新时间:2023-10-31 08:16:07 26 4
gpt4 key购买 nike

在Spring 3.0中有一个@Bean注解。它允许直接在 Java 代码中定义 Spring bean。在浏览 Spring 引用资料时,我发现了两种使用此注释的不同方式 - 在使用 @Configuration 注释的类内部和没有此注释的类内部。

This section包含以下代码:

@Component
public class FactoryMethodComponent {

@Bean @Qualifier("public")
public TestBean publicInstance() {
return new TestBean("publicInstance");
}

// omitted irrelevant method
}

And here我们可以看到一段非常相似的代码,但现在 @Configuration 就位了:

@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}

引用文献的前一节包含以下解释:

Spring 组件中的@Bean 方法的处理方式与 Spring @Configuration 类中的对应方法不同。不同之处在于,@Component 类没有通过 CGLIB 增强来拦截方法和字段的调用。 CGLIB 代理是调用@Configuration 类中的方法或字段@Bean 方法创建对协作对象的bean 元数据引用的方法。方法不是用普通的 Java 语义调用的。相反,在@Component 类中调用方法或字段@Bean 方法具有标准的 Java 语义。

但是 CGLIB 是一种内部的东西,应用程序开发人员不应该知道(当然在理想世界中)。据我了解,在这两种情况下,Spring 都会调用用 @Bean 注释的方法来创建 Spring bean,在这两种情况下,这些实例都会被注入(inject)到协作者中。

所以我的问题是这两种情况对我作为应用程序开发人员来说有什么区别

最佳答案

不同之处在于,使用@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);
}
}

关于java - @Bean 在类中使用@Configuration 和不使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3330618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com