Spring Framework系列--ApplicationContext配置标签详解(二)构造器依赖配置

基础bean的配置可以查看:

Spring Framework系列--ApplicationContext配置标签详解(一)bean的基础标签配置

本章主要是针对依赖注入的两种方式中的构造器注入:

  • 构造器注入
  • setter方法注入

使用例子来说明如何进行bean的依赖配置。

和上一篇博客一样,本文的结构是以一个个小样例的形式给出,通过小样例来介绍一个个标签的作用。

样例1:

样例1是针对使用构造器注入依赖bean对象的情况,因为没有声明每个bean应该注入到哪个参数,所以这部分是由spring控制的,这就需要构造器参数之间没有什么二义性,比如两个参数使用一个接口啥的,不然spring也不知道应该谁注入谁了。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    
    <bean id="foo" class="x.y.Foo">
        <constructor-arg ref="bar"/>
        <constructor-arg ref="baz"/>
    </bean>

    <bean id="bar" class="x.y.Bar"/>

    <bean id="baz" class="x.y.Baz"/>


    <!-- more bean definitions for data access objects go here -->

</beans>
public class Foo {

    public Foo(Bar bar, Baz baz) {
        // ...
    }
}
标签名 所属上级标签 说明
<constructor-arg> <bean> 用来声明使用构造器创建bean对象的参数配置信息
<constructor-arg ref> <constructor-arg> 用来声明该参数依赖的bean对象

样例2:

样例2是针对使用构造器参数里面有基础类型参数的情况,比如int,String类型的参数。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="exampleBean" class="examples.ExampleBean">
        <constructor-arg type="int" value="7500000"/>
        <constructor-arg type="java.lang.String" value="42"/>
    </bean>
    
    <!-- more bean definitions for data access objects go here -->

</beans>
标签名 所属上级标签 说明
<constructor-arg type> <constructor-arg> 用来声明构造器中该参数的具体Java类型
<constructor-arg value> <constructor-arg> 用来声明构造器中该参数的值

样例3:

可以使用构造器中参数的顺序来配置依赖。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="exampleBean" class="examples.ExampleBean">
        <constructor-arg index="0" value="7500000"/>
        <constructor-arg index="1" value="42"/>
    </bean>

    <!-- more bean definitions for data access objects go here -->

</beans>

使用index同时还可以解决样例1中参数二义性的问题。

标签名 所属上级标签 说明
<constructor-arg index> <constructor-arg> 用来声明该参数是构造器方法的第几个参数,从0开始

样例4:

可以直接指定构造器中参数名称来注入依赖。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="exampleBean" class="examples.ExampleBean">
        <constructor-arg name="years" value="7500000"/>
        <constructor-arg name="ultimateAnswer" value="42"/>
    </bean>

    <!-- more bean definitions for data access objects go here -->

</beans>

需要对构造器加入注解@ConstructorProperties才可以让spring去查看构造器具体的参数名称,像这样。

扫描二维码关注公众号,回复: 1554215 查看本文章
public class ExampleBean {

    // Fields omitted

    @ConstructorProperties({"years", "ultimateAnswer"})
    public ExampleBean(int years, String ultimateAnswer) {
        this.years = years;
        this.ultimateAnswer = ultimateAnswer;
    }
}
标签名 所属上级标签 说明
<constructor-arg name> <constructor-arg> 用来声明该标签对应的构造器方法的参数名称

猜你喜欢

转载自blog.csdn.net/zhangzhetaojj/article/details/80640956