Spring_DI_XML_01

简介: Spring_DI_XML_01

基于XMl的DI


1.设值注入

2.构造注入

3.p命名空间设值注入

4.c命名空间构造注入


官方文档


设值注入



调用属性的set方法,使用<property name="name" value="FutaoSmile"/>设值注入


环境搭建  -- 属性需要set方法,类不需要构造方法


Bean-Student

/**
 * Created by futao on 2017/10/10.
 */
public class Student {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

配置文件-applicationContext.xml

<?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="student" class="Student">
    </bean>
</beans>

测试

import org.junit.Test
import org.springframework.context.support.ClassPathXmlApplicationContext
/**
 * Created by futao on 2017/10/10.
 */
class Mytest {
    @Test
    fun forTest() {
        val xml = ClassPathXmlApplicationContext("applicationContext.xml")
        val student = xml.getBean("student") as Student
        println(student)
    }
}

输出结果

Student{name='null', age=0}

修改配置文件applicationContext.xml

<?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="student" class="Student">
        <!--设值注入,实际上是通过调用set方法实现-->
        <property name="name" value="FutaoSmile"/>
        <property name="age" value="18"/>
    </bean>
</beans>


测试结果:

Student{name='FutaoSmile', age=18}



新建School类

/**
 * Created by futao on 2017/10/10.
 */
public class School {
    private String schoolName;
    public String getSchoolName() {
        return schoolName;
    }
    public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }
    @Override
    public String toString() {
        return "School{" +
                "schoolName='" + schoolName + '\'' +
                '}';
    }
}


School在Student类中作为属性存在

/**
 * Created by futao on 2017/10/10.
 */
public class Student {
    private String name;
    private int age;
    private School school;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public School getSchool() {
        return school;
    }
    public void setSchool(School school) {
        this.school = school;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", school=" + school +
                '}';
    }
}

修改配置文件applicationContext.xml注入school属性值

<?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="student" class="Student">
        <!--设值注入,实际上是通过调用set方法实现-->
        <!-- 即:property标签调用到的是set方法 -->
        <property name="name" value="FutaoSmile"/>
        <property name="age" value="18"/>
        <!-- 添加school的引用 -->
        <property name="school" ref="school"/>
    </bean>
    <bean id="school" class="School">
        <property name="schoolName" value="Ecjtu"/>
    </bean>
</beans>

测试结果

Student{name='FutaoSmile', age=18, school=School{schoolName='Ecjtu'}}



基于XMl的DI-构造注入



直接调用带参构造器 - 使用<constructor-arg name="0" value="李四"/>构造注入

环境搭建 -- 属性不需要set方法,类需要带参的构造方法

Student类

package gouzaoDI;
/**
 * Created by futao on 2017/10/10.
 */
public class Student {
    private String name;
    private int age;
    private School school;
    /**
     * 带参构造器
     *
     * @param name   姓名
     * @param age    年龄
     * @param school 学校
     */
    public Student(String name, int age, School school) {
        this.name = name;
        this.age = age;
        this.school = school;
    }
    /**
     * 无参构造器
     */
    public Student() {
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", school=" + school +
                '}';
    }
}

School类

package gouzaoDI;
/**
 * Created by futao on 2017/10/10.
 */
public class School {
    private String schoolName;
    /**
     * 带参构造方法
     *
     * @param schoolName 学校名称
     */
    public School(String schoolName) {
        this.schoolName = schoolName;
    }
    /**
     * 无参构造方法
     */
    public School() {
    }
    @Override
    public String toString() {
        return "School{" +
                "schoolName='" + schoolName + '\'' +
                '}';
    }
}

配置文件applicationContextGouzaoDI.xml

<?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="student" class="gouzaoDI.Student">
        <!--构造注入方式1,用index,实际上是通过构造方法注入,index表示构造方法的参数索引-->
        <!--<constructor-arg index="0" value="李四"/>-->
        <!--<constructor-arg index="1" value="18"/>-->
        <!--<constructor-arg index="2" ref="school"/>-->
        <!--构造注入方式2,用name-->
        <!--<constructor-arg name="name" value="李四"/>-->
        <!--<constructor-arg name="age" value="18"/>-->
        <!--<constructor-arg name="school" ref="school"/>-->
        <!--构造注入方式3,省略index和name,但是这样要保证顺序与构造方法中参数的顺序是一样的-->
        <constructor-arg value="李四"/>
        <constructor-arg value="18"/>
        <constructor-arg ref="school"/>
    </bean>
    <bean id="school" class="gouzaoDI.School">
        <constructor-arg index="0" value="华东交通大学"/>
    </bean>
</beans>

测试

/**
     * 构造注入- 通过类的带参构造方法
     */
    @Test
    fun test4gouzaoDI() {
        val xml = ClassPathXmlApplicationContext("applicationContextGouzaoDI.xml")
        val student = xml.getBean("student") as gouzaoDI.Student
        println(student)
    }

结果

Student{name='李四', age=18, school=School{schoolName='华东交通大学'}}


P名字空间设值注入 p:schoolName="East China JiaoTong University"



实际上是通过属性的set方法实现的,所以如果要通过p名字空间进行设只注入的属性,需要为该属性设置setter

XML shortcut with the p-namespace

The p-namespace enables you to use the bean element’s attributes, instead of nested <property/> elements(property), to describe your property values and/or collaborating beans.


配置文件applicationContextPnamespaceDI.xml

注意:需要添加约束xmlns:p="http://www.springframework.org/schema/p"

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--p名字空间设值注入的原理其实是通过属性的set方法实现的,通过追踪代码可以出来-->
    <bean id="student" class="PnamespaceDI.Student" p:name="麻子" p:age="18" p:school-ref="school"/>
    <bean id="school" class="PnamespaceDI.School" p:schoolName="East China JiaoTong University"/>
</beans>

测试

/**
     * p命名空间设值注入
     */
    @Test
    fun test4pNamespaceDI() {
        val xml = ClassPathXmlApplicationContext("applicationContextPnamespaceDI.xml")
        val student = xml.getBean("student") as PnamespaceDI.Student
        println(student)
    }

结果

Student{name='麻子', age=18, school=School{schoolName='East China Jiao Tong University'}}

c名字空间构造注入 - c:schoolName="华东交通大学"



添加约束xmlns:c="http://www.springframework.org/schema/c"


原理:c名字空间构造注入,原理实际上是通过类的构造方法实现的,所以要使用c名字空间注入就需要为类添加带参的构造方法

XML shortcut with the c-namespace

Similar to the the section called “XML shortcut with the p-namespace”, the c-namespace, newly introduced in Spring 3.1, allows usage of inlined attributes for configuring the constructor arguments rather then nested constructor-arg elements.


applicationContextCnamespaceDI.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--p名字空间设值注入的原理其实是通过属性的set方法实现的,通过追踪代码可以出来-->
    <!--<bean id="student" class="PnamespaceDI.Student" p:name="麻子" p:age="18" p:school-ref="school"/>-->
    <!--<bean id="school" class="PnamespaceDI.School" p:schoolName="East China JiaoTong University"/>-->
    <!--c名字空间构造注入,原理实际上是通过类的构造方法实现的-->
    <bean id="student" class="PnamespaceDI.Student" c:name="coder" c:age="18" c:school-ref="school"/>
    <bean id="school" class="PnamespaceDI.School"  c:schoolName="华东交通大学"/>
</beans>


测试结果:


Student{name='coder', age=18, school=School{schoolName='华东交通大学'}}

相关文章
|
7月前
|
XML Java 数据格式
Spring系列文章2:基于xml方式依赖注入
Spring系列文章2:基于xml方式依赖注入
|
XML JSON Java
Spring Boot 返回 XML 数据,一分钟搞定!
Spring核心技术 67 篇文章13 订阅 订阅专栏 Spring Boot 返回 XML 数据,前提必须已经搭建了 Spring Boot 项目,所以这一块代码就不贴了,可以点击查看之前分享的 Spring Boot 返回 JSON 数据,一分钟搞定!。
Spring Boot 返回 XML 数据,一分钟搞定!
|
XML Java Maven
Spring进阶-AOP配置xml
Spring进阶-AOP配置xml
170 1
|
XML Java 数据格式
Spring加载配置xml
Spring加载配置xml
|
XML Java 数据格式
Spring基础篇:使用XML方式实现Spring提供的AOP
使用XML方式实现Spring提供的AOP
112 0
|
XML 缓存 安全
Spring-AOP概述以及xml实现
Spring-AOP概述以及xml实现
Spring-AOP概述以及xml实现
|
XML Java 数据格式
spring基于xml的 ioc
spring基于xml的 ioc
|
XML Java 数据格式
spring学习6-使用xml方式实现spring基本应用
spring学习6-使用xml方式实现spring基本应用
152 0
spring学习6-使用xml方式实现spring基本应用
|
XML NoSQL Java
Spring——IoC中基于xml的DI
Spring——IoC中基于xml的DI
Spring——IoC中基于xml的DI
|
XML Java 数据格式
Spring基于xml自动装配
Spring基于xml自动装配