Spring - 参考 Java bean 在 XML 中创建 bean,反之亦然

Kim*_*ims 6 java spring

如果我在 Java 中使用 @Bean 创建了一个 bean,那么在 XML 中创建 bean 时如何在 XML 中引用此 bean?如果我在 XML 中创建了一个 bean,那么在 Java 中创建 bean 时如何引用该 bean?

San*_*har 7

在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)


Ken*_*han 5

其他答案仅回答了图片的一部分。让我尝试总结一下大局。关键点是每个 bean 都有一个在 spring 容器中唯一的标识符。我们可以使用这个标识符来引用 bean。

bean 标识符可以通过以下方式配置:

  • XML:idname属性<bean/>
  • Java配置:
    • valuename中的属性@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)