Skip to content

IOC(概念和原理)

1、什么是 IOC

(1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理

(2)使用 IOC 目的:为了耦合度降低

(3)做入门案例就是 IOC 实现

2、IOC 底层原理

(1)xml 解析、工厂模式、反射

3、代码理解 IOC 底层原理

java
//第一步 xml配置文件,配置创建的对象
<bean id="dao" class="com.kerwim.UserDao"></bean>
  
//第二步 有service和dao类,创建工厂类
  class UserFactory{
    public static UserDao getDao(){
      //1xml解析获得全路径
      String classValue = class属性; 
      //反射
      Class class = Class.forName(classValue);
      return (UserDao)class.newInstance();
    }
  }

4、IOC(BeanFactory 接口)

1、IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂

2、Spring 提供 IOC 容器实现两种方式:(两个接口) (1)BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用

  • 加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象

(2)ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用 * 加载配置文件时候就会把在配置文件对象进行创建

3、ApplicationContext 接口有实现类

FileSystemXmlApplicationContext:写盘符全路径

ClassPathXmlApplicationContext:写相对路径

5、IOC 操作 Bean 管理(概念)

1、什么是 Bean 管理

(0)Bean 管理指的是两个操作

(1)Spring 创建对象

(2)Spirng 注入属性

2、Bean 管理操作有两种方式

(1)基于 xml 配置文件方式实现

(2)基于注解方式实现

1、IOC 操作 Bean 管理(基于 xml 方式)

1、基于xml方式创建对象

xml
<bean id="user" class="com.kerwim.User"></bean>

2、基于 xml 方式注入属性

(1)DI:依赖注入,就是注入属性

3、第一种注入方式:使用 set 方法进行注入

(1)创建类,定义属性和对应的 set 方法

java
/**
* 演示使用 set 方法进行注入属性 */
public class Book { //创建属性

    private String bname;
    private String bauthor; //创建属性对应的 set 方法
  
    public void setBname(String bname) {
    	this.bname = bname; 
    }
  
    public void setBauthor(String bauthor) {
      this.bauthor = bauthor;
		} 
}

(2)在 spring 配置文件配置对象创建,配置属性注入

xml
<!--2 set 方法注入属性-->
  
<bean id="book" class="com.atguigu.spring5.Book"> 
  <!--使用 property 完成属性注入
		name:类里面属性名称
		value:向属性注入的值 
   -->
    		<property name="bname" value="易筋经"></property>
     		<property name="bauthor" value="达摩老祖"></property>
 </bean>

4、第二种注入方式:使用有参数构造进行注入

(1)创建类,定义属性,创建属性对应有参数构造方法

java
/**
 * @author kerwim
 * @date 2022/5/10 19:39
 */
public class Orders {

    private String ordersName;
    private String ordersAddress;

    public Orders(String ordersName, String ordersAddress) {
        this.ordersName = ordersName;
        this.ordersAddress = ordersAddress;
    }

    public void testOrders(){
        System.out.println("你好...");
    }
}

(2)在 spring 配置文件中进行配置

xml
<!--3 通过有参构造注入-->
    <bean id="orders" class="com.kerwim.spring5.Orders">
        <constructor-arg name="ordersName" value="AppleMacBook"></constructor-arg>
        <constructor-arg name="ordersAddress" value="美国加州"></constructor-arg>
    </bean>
2、IOC 操作 Bean 管理(xml 注入其他类型属性)

1、字面量

xml
        <!--注入空值-->
        <!--<property name="address">-->
        <!--    <null/>-->
        <!--</property>-->

        <!--设置特殊符号
            1 把<>进行转义 &lt; &gt;
            2 把带特殊符号内容写到 CDATA
        -->
        <property name="address">
            <value><![CDATA[<<南京>>]]></value>
        </property>

2、注入属性**-**外部 bean

(1)创建两个类 service 类和 dao 类

(2)在 service 调用 dao 里面的方法

(3)在 spring 配置文件中进行配置

3、注入属性**-**内部 bean 和 级联赋值

(1)一对多关系:部门和员工一个部门有多个员工,一个员工属于一个部门 部门是一,员工是多

(2)在实体类之间表示一对多关系,员工表示所属部门,使用对象类型属性进行表示

java
package com.kerwim.pojo;

/**
 * @author kerwim
 * @date 2022/5/11 16:18
 */
public class Emp {

    private String empName;
    private String gender;

    private Dept dept;

    public Dept getDept() {
        return dept;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    public void add(){
        System.out.println(empName + "====="  + gender + "=====" + dept);
        System.out.println("emp.....");
    }
}
java
package com.kerwim.pojo;

/**
 * @author kerwim
 * @date 2022/5/11 16:17
 */
public class Dept {
    private String deptName;

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptName='" + deptName + '\'' +
                '}';
    }
}
xml
<bean id="emp" class="com.kerwim.pojo.Emp">
        <!--设置两个普通属性-->
        <property name="empName" value="tom"></property>
        <property name="gender" value="man"></property>
        <!--设置对象属性-->
        <property name="dept">
            <bean id="dept" class="com.kerwim.pojo.Dept">
                <property name="deptName" value="软件研发部"></property>
            </bean>
        </property>
    </bean>
3、IOC 操作 Bean 管理(xml 注入集合属性)

1、注入数组类型属性 2、注入 List 集合类型属性 3、注入 Map 集合类型属性 (1)创建类,定义数组、list、map、set 类型属性,生成对应 set 方法

java
public class Stu { //1 数组类型属性
private String[] courses;
//2 list 集合类型属性
private List<String> list;
//3 map 集合类型属性
private Map<String,String> maps; //4 set 集合类型属性
    private Set<String> sets;
public void setSets(Set<String> sets) { this.sets = sets;
}
public void setCourses(String[] courses) {
this.courses = courses; }
public void setList(List<String> list) { this.list = list;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps; }
}

(2)在 spring 配置文件进行配置

xml
        <bean id="student" class="com.apple.pojo.Student">
            <!--数组类型属性注入-->
            <property name="courses">
                <array>
                    <value>java课程</value>
                    <value>数据库课程</value>
                </array>
            </property>

            <!--list 属性注入-->
            <property name="list">
                <list>
                    <value>小明</value>
                    <value>小红</value>
                </list>
            </property>

            <!--map类型属性注入-->
            <property name="maps">
                <map>
                    <entry key="Java" value="spring"></entry>
                    <entry key="GoLang" value="gay"></entry>
                </map>
            </property>

            <!--set 类型属性注入-->
            <property name="sets">
                <set>
                    <value>MySql</value>
                    <value>Redis</value>
                </set>
            </property>
        </bean>

4、在集合里面设置对象类型值

xml

    <bean id="course1" class="com.apple.pojo.Course2">
        <property name="courseName" value="语文"></property>
    </bean>

    <bean id="course2" class="com.apple.pojo.Course2">
        <property name="courseName" value="数学"></property>
    </bean>

<!--注入实体类-->
            <property name="course2List">
                <list>
                    <ref bean="course1"></ref>
                    <ref bean="course2"></ref>
                </list>
            </property>

4、在集合里面设置对象类型值

xml

    <bean id="course1" class="com.apple.pojo.Course2">
        <property name="courseName" value="语文"></property>
    </bean>

    <bean id="course2" class="com.apple.pojo.Course2">
        <property name="courseName" value="数学"></property>
    </bean>

<!--注入实体类-->
            <property name="course2List">
                <list>
                    <ref bean="course1"></ref>
                    <ref bean="course2"></ref>
                </list>
            </property>
~~~ **5**、把集合注入部分提取出来

(1)在 spring 配置文件中引入名称空间 util

~~~xml
<!--(1)在 spring 配置文件中引入名称空间 util-->

<?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:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/util  http://www.springframework.org/schema/util/spring-util.xsd">
  
<!--(2)使用 util 标签完成 list 集合注入提取 -->
    <util:list id="bookList">
            <value>三体</value>
            <value>百年孤独</value>
            <value>月亮与六便士</value>
        </util:list>
  
  <!--注入集合-->
    <bean id="book" class="com.apple.pojo.Book">
        <property name="list" ref="bookList"></property>
    </bean>

Spring 概述

java
package com.kerwim.pojo;

/**
 * @author kerwim
 * @date 2022/5/11 16:17
 */
public class Dept {
    private String deptName;

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptName='" + deptName + '\'' +
                '}';
    }
}

IOC 控制反转

java
package com.kerwim.pojo;

/**
 * @author kerwim
 * @date 2022/5/11 16:17
 */
public class Dept {
    private String deptName;

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptName='" + deptName + '\'' +
                '}';
    }
}

AOP 面向切面编程

java
package com.kerwim.pojo;

/**
 * @author kerwim
 * @date 2022/5/11 16:17
 */
public class Dept {
    private String deptName;

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptName='" + deptName + '\'' +
                '}';
    }
}

JdbcTemplate 数据库操作

java
package com.kerwim.pojo;

/**
 * @author kerwim
 * @date 2022/5/11 16:17
 */
public class Dept {
    private String deptName;

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptName='" + deptName + '\'' +
                '}';
    }
}

事务管理

java
package com.kerwim.pojo;

/**
 * @author kerwim
 * @date 2022/5/11 16:17
 */
public class Dept {
    private String deptName;

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptName='" + deptName + '\'' +
                '}';
    }
}