所谓 Bean 属性注入,简单点说就是将属性注入到 Bean 中的过程,而这属性既可以普通属性,也可以是一个对象(Bean)。

Spring 主要通过以下 2 种方式实现属性注入:

  • 构造函数注入
  • setter 注入(又称设值注入)

构造函数注入

 

 我们可以通过 Bean 的带参构造函数,以实现 Bean 的属性注入。

 使用构造函数实现属性注入大致步骤如下:

  1. 在 Bean 中添加一个有参构造函数,构造函数内的每一个参数代表一个需要注入的属性;
  2. 在 Spring 的 XML 配置文件中,通过 <beans> 及其子元素 <bean> 对 Bean 进行定义;
  3. 在 <bean> 元素内使用 <constructor-arg> 元素,对构造函数内的属性进行赋值,Bean 的构造函数内有多少参数,就需要使用多少个 <constructor-arg> 元素。

 

项目依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>ssw</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.5.RELEASE</version>
        </dependency>
    </dependencies>

</project>

 

spring boot 注入 springboot注入带参构造函数_spring

 

 

 

 

 

创建student类:

package org.example;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Student
{

    private static final Log LOGGER = LogFactory.getLog(Student.class);

    private int id;
    private String name;
    private Grade grade;

    public Student(int id, String name, Grade grade)
    {
        LOGGER.info("正在执行 Course 的有参构造方法,参数分别为:id=" + id + ",name=" + name + ",grade=" + grade);
        this.id = id;
        this.name = name;
        this.grade = grade;
    }

    @Override
    public String toString()
    {

        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", grade=" + grade +
                '}';
    }
}

spring boot 注入 springboot注入带参构造函数_spring_02

  

创建grade类:

package org.example;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Grade
{

    private static final Log LOGGER = LogFactory.getLog(Grade.class);

    private Integer gradeId;
    private String gradeName;

    public Grade(Integer gradeId, String gradeName)
    {
        LOGGER.info("正在执行 Course 的有参构造方法,参数分别为:gradeId=" + gradeId + ",gradeName=" + gradeName);

        this.gradeId = gradeId;
        this.gradeName = gradeName;
    }
    @Override
    public String toString()
    {

        return "Grade{" +
                "gradeId=" + gradeId +
                ", gradeName='" + gradeName + '\'' +
                '}';
    }
}

spring boot 注入 springboot注入带参构造函数_spring_03

   

创建bean:

<?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
       https://www.springframework.org/schema/beans/spring-beans.xsd">

<!--    <bean id="helloWorld" class="org.example.HelloWorld">-->
<!--        <property name="message" value="Hello World!——china"/>-->
<!--    </bean>-->

    <bean id="student" class="org.example.Student">
        <constructor-arg name="id" value="2"></constructor-arg>
        <constructor-arg name="name" value="李四"></constructor-arg>
        <constructor-arg name="grade" ref="grade"></constructor-arg>
    </bean>

    <bean id="grade" class="org.example.Grade">
        <constructor-arg name="gradeId" value="4"></constructor-arg>
        <constructor-arg name="gradeName" value="四年级"></constructor-arg>
    </bean>

</beans>

spring boot 注入 springboot注入带参构造函数_spring_04

 

 

spring boot 注入 springboot注入带参构造函数_构造函数_05

  

执行:

package org.example;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main
{
    private static final Log LOGGER = LogFactory.getLog(Main.class);

    public static void main(String[] args)
    {
        //获取 ApplicationContext 容器
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

        //获取名为 student 的 Bean
        Student student = context.getBean("student", Student.class);

        //通过日志打印学生信息
        LOGGER.info(student.toString());

        System.out.println(student.toString());

    }

}

spring boot 注入 springboot注入带参构造函数_apache_06

 

执行结果:

spring boot 注入 springboot注入带参构造函数_构造函数_07