Spring_DI_XML_01

简介: 欢迎移步博客查看-http://futaosmile.oschina.io/coder957基于XMl的DI1.设值注入2.构造注入3.p命名空间设值注入4.

欢迎移步博客查看-http://futaosmile.oschina.io/coder957

基于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='华东交通大学'}}

目录
相关文章
|
6月前
|
Java Spring
Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)
Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)
|
6月前
|
Java API Spring
Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC
Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC
|
1月前
|
存储 Java 程序员
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
本文详细讲解了Spring框架中IOC容器如何存储和取出Bean对象,包括五大类注解(@Controller、@Service、@Repository、@Component、@Configuration)和方法注解@Bean的用法,以及DI(依赖注入)的三种注入方式:属性注入、构造方法注入和Setter注入,并分析了它们的优缺点。
28 0
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
|
1月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
28 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
6月前
|
XML Java 数据格式
Spring框架入门:IoC与DI
【5月更文挑战第15天】本文介绍了Spring框架的核心特性——IoC(控制反转)和DI(依赖注入)。IoC通过将对象的创建和依赖关系管理交给容器,实现解耦。DI作为IoC的实现方式,允许外部注入依赖对象。文章讨论了过度依赖容器、配置复杂度等常见问题,并提出通过合理划分配置、使用注解简化管理等解决策略。同时,提醒开发者注意过度依赖注入和循环依赖,建议适度使用构造器注入和避免循环引用。通过代码示例展示了注解实现DI和配置类的使用。掌握IoC和DI能提升应用的灵活性和可维护性,实践中的反思和优化至关重要。
368 4
|
2月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
2月前
|
Java 数据库连接 Maven
Spring基础1——Spring(配置开发版),IOC和DI
spring介绍、入门案例、控制反转IOC、IOC容器、Bean、依赖注入DI
Spring基础1——Spring(配置开发版),IOC和DI
|
5月前
|
存储 Java 测试技术
Java Spring IoC&DI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性
Java Spring IoC&DI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性
41 1
|
5月前
|
存储 Java 程序员
Spring IoC&DI(2)—IoC详解
Spring IoC&DI(2)—IoC详解
42 2
|
5月前
|
存储 Java C++
理解SpringIOC和DI第一课(Spring的特点),IOC对应五大注解,ApplicationContext vs BeanFactory
理解SpringIOC和DI第一课(Spring的特点),IOC对应五大注解,ApplicationContext vs BeanFactory