为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪7331174 2023-07-19 16:45:44
如果我在 Java 中使用 @Bean 创建了一个 bean,那么在 XML 中创建 bean 时如何在 XML 中引用此 bean?如果我在 XML 中创建了一个 bean,那么在 Java 中创建 bean 时如何引用该 bean?
查看完整描述

3 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

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

    }

}

上面的内容与下面的appConfig.xml完全等效:


<beans>

    <bean name="transferService" class="com.company.TransferServiceImpl"/>

</beans>

两者都会导致 BeanFactory/ApplicationContext 中存在一个名为 TransferService 的 bean,该 bean 绑定到 TransferServiceImpl 类型的对象实例:


而且您还需要确保添加


<bean class="org.springframework.config.java.process.ConfigurationPostProcessor"/> 

在您的 xml 中,因此如果您的 XML 配置和 Java 配置在不同的上下文中声明,则它们具有相同的 bean 定义。


如果您想将传统的 bean 配置从 XML 包含到 Java 配置,那么您需要将 XML 资源导入到该类,如下所示:


@ImportResource({"classpath*:your-configuration.xml"})


查看完整回答
反对 回复 2023-07-19
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

其他答案仅回答了图片的一部分。让我尝试总结一下大局。关键点是每个 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>

所以service属性是对一个 bean 的引用,其标识符被称为bar

要在 Java 中引用 XML 中声明的 bean,您只需@Autowired在字段上进行注释即可。如果只有一个 Spring bean 的类型与该字段的类型相同(本例中为 Bar),则该 bean 将自动被引用并注入。它被称为按类型自动连接,您不需要通过 bean 标识符来引用它:

@Service

public class Foo {


   @Autowired   

   private Bar service;


}

另一方面,如果有多个类型也是 Bar 的 bean,则必须使用@Qualifierbean 标识符来引用这些 Bar beans 中的特定 bean。这称为按名称自动连接:


@Service

public class Foo {


   @Autowired   

   @Qualifier("bar123")

   private Bar service;


}


查看完整回答
反对 回复 2023-07-19
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

您可以创建一个简单的 Spring bean、Grandmother,并添加对 beans MotherBean 和 FatherBean 的引用。


您有两种方法可以做到这一点:


第一种方法


豆奶奶:


@Service("grandmotherBean")

public class Grandmother {


    @Autowired

    private MotherBean motherBean;


    @Autowired

    private FatherBean father;


}

豆妈妈来了


@Service("motherBeanBean")

public class MotherBean {

public MotherBean() {


}


@Override

public String toString() {

    return " it is me ! MotherBean";

}


}

豆爸爸来了


@Service("fatherBeanBean")

public class FatherBean {

    public  FatherBean (){


    }


    @Override

    public String toString() {

        return " it is me ! FatherBean";

    }



}

另一种方法是您可以直接配置 Spring bean 引用applicationContext.xml


第二种方法


<beans xmlns="http://www.springframework.org/schema/beans"


    <bean id="Grandmother"

        class="com.dulaj.stack.Grandmother">

        <property name="FatherBean" >

            <ref local="fatherBeanBean"/>

        </property>

    </bean>


  <bean id="fatherBeanBean" class="com.dulaj.stack.FatherBean">

    </bean>  

</beans>


查看完整回答
反对 回复 2023-07-19
  • 3 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信