Spring——IoC中基于xml的DI

简介: Spring——IoC中基于xml的DI

文章目录:


1.DI:给属性赋值

2.基于xmlDI

2.1 set注入(推荐使用!!!)

2.1.1 简单类型的set注入 

2.1.2 引用类型的set注入

2.2 构造注入(理解就行。。。)

2.3 引用类型的自动注入(基于set注入)

2.3.1 byName(按名称注入)

2.3.2 byType(按类型注入)

3.Spring加载多个配置文件

3.1 总配置文件 

3.2 分配置文件1

3.3 分配置文件2

1.DI:给属性赋值


Spring调用类的无参构造方法,创建对象,对象创建后给属性赋值。

给属性赋值有两种大的方法:1.使用xml配置文件中的标签和属性。2.使用注解

基于xml配置文件的DI有两种方式:set注入(设值注入)。构造注入。 

以下所有的实例均给出三块代码(相关属性类、spring配置文件、测试类)。

2.基于xml的DI


2.1 set注入(推荐使用!!!)

set注入也叫设值注入是指,通过 setter 方法传入被调用者的实例。这种注入方式简单、直观,因而在 Spring 的依赖注入中大量使用。

2.1.1 简单类型的set注入 

package com.bjpowernode.ba01;
/**
 *
 */
public class Student {
    private String name;
    private int age;
    public Student() {
        System.out.println("Student类无参构造方法");
    }
    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 +
                '}';
    }
}
    <!--
        DI: 给属性赋值
        1.set注入:spring调用类的set方法,通过set方法完成属性赋值
          简单类型的set注入:
          语法:<bean id="xxx" class="yyy">
                    <property name="属性名" value="简单类型属性值">
                    ...
               </bean>
    -->
    <bean id="myStudent" class="com.bjpowernode.ba01.Student">
        <!-- setName("李四") -->
        <property name="name" value="李四"/>
        <!-- setAge(20) -->
        <property name="age" value="20"/>
    </bean>
    <!-- 声明日期类 -->
    <bean id="mydate" class="java.util.Date">
        <!-- setTime() -->
        <property name="time" value="9992361646"/>
    </bean>
    @Test
    public void test01() {
        String config="ba01/applicationContext.xml";
        ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
        Student student= (Student) ctx.getBean("myStudent");
        System.out.println("student===" + student);
        Date date= (Date) ctx.getBean("mydate");
        System.out.println("date===" + date);
    }

2.1.2 引用类型的set注入

package com.bjpowernode.ba02;
/**
 *
 */
public class School {
    private String name;
    private String address;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "School{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
package com.bjpowernode.ba02;
/**
 *
 */
public class Student {
    private String name;
    private int age;
    private School school;
    public Student() {
        System.out.println("Student类无参构造方法");
    }
    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 +
                '}';
    }
}
    <!--
        DI: 给属性赋值
         2.set注入:spring调用类的set方法,通过set方法完成属性赋值
           引用类型的set注入:
           语法:<bean id="xxx" class="yyy">
                    <property name="属性名" ref="bean的id值">
                    ...
                </bean>
    -->
    <bean id="myStudent" class="com.bjpowernode.ba02.Student">
        <!-- 简单类型的赋值 -->
        <!-- setName("李四") -->
        <property name="name" value="李四"/>
        <!-- setAge(20) -->
        <property name="age" value="20"/>
        <!-- 引用类型的赋值 -->
        <!-- setSchool(mySchool) -->
        <property name="school" ref="mySchool"/>
    </bean>
    <!-- 声明School -->
    <bean id="mySchool" class="com.bjpowernode.ba02.School">
        <property name="name" value="北京大学"/>
        <property name="address" value="北京海淀区"/>
    </bean>
    @Test
    public void test01() {
        String config="ba02/applicationContext.xml";
        ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
        Student student= (Student) ctx.getBean("myStudent");
        System.out.println("student===" + student);
    }

2.2 构造注入(理解就行。。。)

构造注入是指,在构造调用者实例的同时,完成被调用者的实例化。即,使用构造器设置依赖关系。

package com.bjpowernode.ba03;
/**
 *
 */
public class School {
    private String name;
    private String address;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "School{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
package com.bjpowernode.ba03;
/**
 *
 */
public class Student {
    private String name;
    private int age;
    private School school;
    public Student() {
        System.out.println("Student类无参构造方法");
    }
    public Student(String name, int age, School school) {
        System.out.println("Student有参构造方法");
        this.name = name;
        this.age = age;
        this.school = school;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", school=" + school +
                '}';
    }
}
    <!--
        DI: 给属性赋值
        1.构造注入:Spring调用类的有参构造方法,创建对象同时给属性赋值
          语法:<bean id="xxx" class="yyy">
                    <constructor-arg />: 表示一个构造方法的形参
                    属性:name: 构造方法的形参名
                         index:构造方法的参数位置
                         value:简单类型的形参值
                         ref:  引用类型的形参值
               </bean>
    -->
    <bean id="myStudent" class="com.bjpowernode.ba03.Student">
        <!-- <constructor-arg index="0" value="李四"/> -->
        <constructor-arg name="name" value="李四"/>
        <!-- <constructor-arg index="1" value="20"/> -->
        <constructor-arg name="age" value="20"/>
        <!-- <constructor-arg index="2" ref="mySchool"/> -->
        <constructor-arg name="school" ref="mySchool"/>
    </bean>
    <!-- 声明School -->
    <bean id="mySchool" class="com.bjpowernode.ba03.School">
        <property name="name" value="北京大学"/>
        <property name="address" value="北京海淀区"/>
    </bean>
    @Test
    public void test01() {
        String config="ba03/applicationContext.xml";
        ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
        Student student= (Student) ctx.getBean("myStudent");
        System.out.println("student===" + student);
    }

2.3 引用类型的自动注入(基于set注入)

对于引用类型属性的注入,也可不在配置文件中显示的注入。可以通过为<bean/>标签设置 autowire 属性值,为引用类型属性进行隐式自动注入(默认是不自动注入引用类型属性)。根据自动注入判断标准的不同,可以分为两种:

byName:根据名称自动注入

byType根据类型自动注入 

2.3.1 byName(按名称注入)

Java类中引用类型属性名称和 Spring 容器中 bean id 名称一样,且数据类型也是一样的。这些 bean 能够赋值给引用类型。

package com.bjpowernode.ba04;
/**
 *
 */
public class School {
    private String name;
    private String address;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "School{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
package com.bjpowernode.ba04;
/**
 *
 */
public class Student {
    private String name;
    private int age;
    private School school;
    public Student() {
        System.out.println("Student类无参构造方法");
    }
    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 +
                '}';
    }
}
    <!-- 引用类型自动注入 -->
    <!-- byName -->
    <bean id="myStudent" class="com.bjpowernode.ba04.Student" autowire="byName">
        <!-- 简单类型的赋值 -->
        <!-- setName("李四") -->
        <property name="name" value="李四"/>
        <!-- setAge(20) -->
        <property name="age" value="20"/>
        <!-- 引用类型的赋值 -->
        <!-- setSchool(mySchool) -->
        <!--<property name="school" ref="mySchool"/>-->
    </bean>
    <!-- 声明School -->
    <bean id="school" class="com.bjpowernode.ba04.School">
        <property name="name" value="清华大学"/>
        <property name="address" value="北京海淀区"/>
    </bean>
    @Test
    public void test01() {
        String config="ba04/applicationContext.xml";
        ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
        Student student= (Student) ctx.getBean("myStudent");
        System.out.println("student===" + student);
    }

2.3.2 byType(按类型注入)

Java类中引用类型的数据类型和 Spring 容器中 bean class 值是同源的,这样的 bean 赋值给引用类型。

同源关系是指:

1.    Java 中引用类型的数据类型和 bean class 值是一样的。

2.    Java 中引用类型的数据类型和 bean class 值是父子类关系的。

3.    Java 中引用类型的数据类型和 bean class 值是接口和实现关系的。

但这样的同源的被调用 bean只能有一个。如果多于一个,容器就不知该匹配哪一个了。

package com.bjpowernode.ba05;
/**
 *
 */
public class School {
    private String name;
    private String address;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "School{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
package com.bjpowernode.ba05;
/**
 *
 */
public class Student {
    private String name;
    private int age;
    private School school;
    public Student() {
        System.out.println("Student类无参构造方法");
    }
    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 +
                '}';
    }
}
    <!-- 引用类型自动注入 -->
    <!-- byType -->
    <bean id="myStudent" class="com.bjpowernode.ba05.Student" autowire="byType">
        <!-- 简单类型的赋值 -->
        <!-- setName("李四") -->
        <property name="name" value="张三"/>
        <!-- setAge(20) -->
        <property name="age" value="25"/>
        <!-- 引用类型的赋值 -->
        <!-- setSchool(mySchool) -->
        <!--<property name="school" ref="mySchool"/>-->
    </bean>
    <!-- 声明School -->
    <bean id="school" class="com.bjpowernode.ba05.School">
        <property name="name" value="清华大学"/>
        <property name="address" value="北京海淀区"/>
    </bean>
    @Test
    public void test01() {
        String config="ba05/applicationContext.xml";
        ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
        Student student= (Student) ctx.getBean("myStudent");
        System.out.println("student===" + student);
    }


3.Spring加载多个配置文件


项目中如果使用多个spring配置文件,可以采用分多个配置文件的方式:

1.    按功能模块分,一个模块一个配置文件。

2.    按类的功能分,数据库操作相关的类在一个配置文件,service类在一个配置文件,redis、事务相关的在一个配置文件。

spring管理多个配置文件,常用的是包含关系的配置文件,项目中有一个总的文件,里面是有import标签包含其他多个配置文件。

3.1 总配置文件 

    <!--
        当前是总的文件,目的是包含其他多个配置文件,一般不声明bean
        语法:<import resource="classpath:其他文件的路径" />
        classpath: 表示类路径,spring通过类路径加载配置文件
    -->
    <import resource="classpath:ba06/spring-school.xml" />
    <import resource="classpath:ba06/spring-student.xml" />
    <!-- 上面两行等价于下面这行 -->
    <!--
        <import resource="classpath:ba06/spring-*.xml" />
    -->

3.2 分配置文件1

    <!-- 引用类型自动注入 -->
    <!-- byType -->
    <bean id="myStudent" class="com.bjpowernode.ba06.Student" autowire="byType">
        <!-- 简单类型的赋值 -->
        <!-- setName("李四") -->
        <property name="name" value="张三"/>
        <!-- setAge(20) -->
        <property name="age" value="25"/>
        <!-- 引用类型的赋值 -->
        <!-- setSchool(mySchool) -->
        <!--<property name="school" ref="mySchool"/>-->
    </bean>

3.3 分配置文件2

    <!-- 声明School -->
    <bean id="school" class="com.bjpowernode.ba06.School">
        <property name="name" value="清华大学"/>
        <property name="address" value="北京海淀区"/>
    </bean>
相关文章
|
1月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
8月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
2121 1
|
9月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
640 26
|
8月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
453 0
|
5月前
|
XML 人工智能 Java
Spring IOC 到底是什么?
IOC(控制反转)是一种设计思想,主要用于解耦代码,简化依赖管理。其核心是将对象的创建和管理交给容器处理,而非由程序直接硬编码实现。通过IOC,开发者无需手动new对象,而是由框架负责实例化、装配和管理依赖对象。常见应用如Spring框架中的BeanFactory和ApplicationContext,它们实现了依赖注入和动态管理功能,提升了代码的灵活性与可维护性。
191 1
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
6月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
8月前
|
Java 容器 Spring
什么是Spring IOC 和DI ?
IOC : 控制翻转 , 它把传统上由程序代码直接操控的对象的调用权交给容 器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转 移,从程序代码本身转移到了外部容器。 DI : 依赖注入,在我们创建对象的过程中,把对象依赖的属性注入到我们的类中。
|
11月前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
180 21
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)

热门文章

最新文章

下一篇
oss云网关配置