如果我在 Java 中使用 @Bean 创建了一个 bean,那么在 XML 中创建 bean 时如何在 XML 中引用此 bean?如果我在 XML 中创建了一个 bean,那么在 Java 中创建 bean 时如何引用该 bean?
在Java 类中创建bean 相当于在XML 文件中创建bean。因此,如果您想在 XML 文件中引用在 Java 类中创建的 bean,只需使用ref= beanName属性来引用该 bean,反之亦然。
官方文档中写道:
4.2.1. 声明一个bean
要声明 bean,只需使用 @Bean 注释来注释方法即可。当JavaConfig遇到这样的方法时,它将执行该方法并将返回值注册为BeanFactory中的bean。默认情况下,bean 名称将是方法名称。
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
Run Code Online (Sandbox Code Playgroud)
上面的内容与下面的appConfig.xml完全等效:
<beans>
<bean name="transferService" class="com.company.TransferServiceImpl"/>
</beans>
Run Code Online (Sandbox Code Playgroud)
两者都会导致 BeanFactory/ApplicationContext 中存在一个名为 TransferService 的 bean,该 bean 绑定到 TransferServiceImpl 类型的对象实例:
而且您还需要确保添加
<bean class="org.springframework.config.java.process.ConfigurationPostProcessor"/>
Run Code Online (Sandbox Code Playgroud)
在您的 xml 中,因此如果您的 XML 配置和 Java 配置在不同的上下文中声明,则它们具有相同的 bean 定义。
如果您想将传统的 bean 配置从 XML 包含到 Java 配置,那么您需要将 XML 资源导入到该类,如下所示:
@ImportResource({"classpath*:your-configuration.xml"})
Run Code Online (Sandbox Code Playgroud)
其他答案仅回答了图片的一部分。让我尝试总结一下大局。关键点是每个 bean 都有一个在 spring 容器中唯一的标识符。我们可以使用这个标识符来引用 bean。
bean 标识符可以通过以下方式配置:
id和name属性<bean/>value和name中的属性@Bean。 value属性 in@Component及其构造型注释,例如等@Service。@Controller如果未显式配置标识符,则根据 Bean 的声明方式,将为它们生成一个默认标识符:
对于使用 XML 及其构造型声明的 bean ,它是采用lowerCamelCase@Component格式的该 bean 的类名。
对于使用 声明的 bean @Bean,它是该 bean 方法的名称
要引用 XML 中 Java 配置中声明的 bean,请使用ref属性来引用其标识符,例如:
<bean name="foo" class="com.example.Foo">
<property name="service" ref="bar"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
所以service属性是对一个 bean 的引用,其标识符被称为bar
要在 Java 中引用 XML 中声明的 bean,您只需@Autowired在字段上进行注释即可。如果只有一个 spring bean 的类型与该字段的类型相同(本例中为 Bar),则该 bean 将自动被引用并注入。它被称为按类型自动连接,您不需要通过 bean 标识符来引用它:
@Service
public class Foo {
@Autowired
private Bar service;
}
Run Code Online (Sandbox Code Playgroud)
另一方面,如果有多个类型也是 Bar 的 bean,则必须使用@Qualifierbean 标识符来引用这些 Bar beans 中的特定 bean。这称为按名称自动连接:
@Service
public class Foo {
@Autowired
@Qualifier("bar123")
private Bar service;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17166 次 |
| 最近记录: |