• IOC 的底层原理和Bean管理XML方式、xml注入集合属性


    目录

        什么是IOC 

              IOC底层管理 

    工厂模式

    IOC 的过程 

    IOC 接口

     IOC 操作Bean 原理

    Bean 管理操作有两种方式

    1. 基于xml 配置方式创建对象

    2. 基于xml方式注入属性

    第二种使用有参数构造注入

    p 名称空间注入

     ICO操作Bean管理(xml 注入其他类型属性)

    注入属性-外部bean

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

    IOC 操作Bean管理(xml注入集合属性)

    在spring配置文件进行配置

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

    把集合部分注入提取出来


        什么是IOC 

            控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理
            使用IOC目的,为了降低耦合度 

        IOC底层管理 

              xml解析、工厂模式、反射

    IOC的实现原理—反射与工厂模式的结合

    工厂模式

    下面是原始的模式

    耦合度太高导致service 和到任何一个发生变化,另一个都会发生变化,所以我们需要将耦合度降低,并且降低到最低限度。

    再看看工厂模式,下图通过工厂模式降低 service 和 Dao 的耦合性,最终的目的是将耦合度降低到最低限度。

    IOC 的过程 

    第一步:xml配置文件,配置创建的对象

    <bean id= "dao" class="com.aiguigu.UserDao">bean>

    第二步,有service类和dao类,创建工厂类。

    之前是直接new一个对象,但现在不这样做了,现在通过xml 解析和反射来完成。

    由xml 解析来获取上面的值,然后通过反射得到编码文件创建对象

     目的:进一步降低耦合度

    IOC 接口

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

    2.Spring  提供IOC容器实现两种方式:(有两个接口) 

      BeanFactory :IOC容器基本实现,是spring 内部的使用接口,不提供开发人员进行使用

    ApplicationContext :BeanFactory 接口的子接口,提供更多强大的功能,一般由于开发人员进行使用。

    加载配置文件 时候就会把配置文件对象进行创建。

    ApplicationContext 接口有实现类:

     IOC 操作Bean 原理

    什么是Bean管理

    Bean 管理指的是两个操作:Spring 创建对象、Spring注入属性。

    如下,在创建对象过程中获取属性就叫bean管理。

    创建了一个userName 属性,然后向username中设置值

    1. public class User {
    2. private String userName;
    3. public void add() {
    4. System.out.println("add....");
    5. }
    6. }

    Bean 管理操作有两种方式

    第一种: 基于xml 配置方式实现

    第二种:基于注解方式实现

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

    1. 基于xml 配置方式创建对象

     配置User对象创建

    <bean id= "dao" class="com.aiguigu.UserDao">bean>

     1. 在spring 配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建。

    2. 在bean标签有很多属性,介绍常用的属性:

    id 属性:唯一标识

    class属性:类全路径(包类路径)

    3. 创建对象时候,默认也是执行无参数构造方法完成对象创建

    2. 基于xml方式注入属性

    DI : 依赖注入,就是注入属性

    第一种注入方式,使用set方法进行注入。

    1. public class Book {
    2. //使用set方法进行注入属性
    3. //创建属性
    4. private String bname;
    5. private String bautbur;
    6. //创建属性对应的set方法
    7. public void setBautbur(String bautbur) {
    8. this.bautbur = bautbur;
    9. }
    10. public void Book(String bname) {
    11. this.bname = bname;
    12. }
    13. }

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

    1. <bean id="book" class="com.atguigu.spring5.Book">
    2. <property name="bname" value="异烟肼">property>
    3. <property name="bautbur" value="贵妃椅">property>
    4. bean>

    第二种使用有参数构造注入

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

    1. public class Orders {
    2. //属性
    3. private String oname;
    4. private String address;
    5. //有参构造
    6. public Orders(String oname, String address) {
    7. this.oname = oname;
    8. this.address = address;
    9. }
    10. }

     在spring配置文件中进行配置

    1. <bean id="orders" class="com.atguigu.spring5.Orders">
    2. <constructor-arg name="oname" value="abc">constructor-arg>
    3. <constructor-arg name="address" value="China">constructor-arg>
    4. bean>

    p 名称空间注入

    使用 p 名称空间注入,可以简化基于xml 配置方式。

    第一步 添加p名称空间在配置文件中

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:p="http://www.springframework.org/schema/p"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. bean>

    第二步进行属性注入,在bean标签里面进行操作

    1. <bean id="book" class="com.atguigu.spring5.Book" p:bname="spring入门" p:bautbur="spring5书籍">bean>
    2. beans>

     ICO操作Bean管理(xml 注入其他类型属性)

    字面量

    null

    1. <property name="address">
    2. <null/>
    3. property>

    属性值包含特殊字符

      把<>进行转义<;&;

    把带特殊字符内容写到CDATA

    1. <property name="address">
    2. <value>
    3. >]]>
    4. value>
    5. property>

    注入属性-外部bean

    先看看原始的方式:创建 UserDao 对象

    1. public void add(){
    2. System.out.println("UserService add...");
    3. //原始方式创建:创建 UserDao 对象
    4. UserDao userDao = new UserDaoImpI();
    5. userDao.update();
    6. }

     下面用另一种方式创建,先创建Userdao、Userservice、UserImpI层,在UserDaoImpI中创建两个对象,然后在Userservice注入到里面,可以有参构造也可以用set构造,之前是使用字符串类型,一个一个地注入,现在使用的是Userdao是对象类型,也可以是属性也可以是字符串、对象都可以,现在Userservice里面把UserDaoImpI注入。

    先创建两个类service类和dao类,在service调用dao里面的方法,在spring配置文件中进行配置

    UserDao

    1. package com.atguigu.spring5.dao;
    2. public interface UserDao {
    3. public void update();
    4. }

     UserDaoImpI

    1. package com.atguigu.spring5.dao;
    2. public class UserDaoImpI implements UserDao{
    3. @Override
    4. public void update() {
    5. System.out.println("dao update.....");
    6. }
    7. }

    UserService 

    1. public class UserService {
    2. //创建UserDao类型属性生成set方法
    3. private UserDao userDao;
    4. public void setUserDao(UserDao userDao) {
    5. this.userDao = userDao;
    6. }
    7. public void add() {
    8. System.out.println("UserService add...");
    9. /* //原始方式创建:创建 UserDao 对象
    10. UserDao userDao = new UserDaoImpI();*/
    11. userDao.update();
    12. }
    13. }

     xml 文件

    1. <bean id="userService" class="com.atguigu.spring5.dao.UserDao.UserService">
    2. <property name="userDao" ref="userDaoImpI">
    3. property>
    4. bean>

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

    一对多关系:部门和员工

    一个部门有多个员工,一个员工属于一个部门;部门是一,员工是多。

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

    部门类

    1. //部门类
    2. public class Dept {
    3. private String dname;
    4. public void setDname(String dname) {
    5. this.dname = dname;
    6. }
    7. }

    员工类

    1. //员工类
    2. public class Emp {
    3. private String ename;
    4. private String gender;
    5. //员工属于某个部门,使用对象形式表示
    6. private Dept dept;
    7. public void setDept(Dept dept) {
    8. this.dept = dept;
    9. }
    10. public void setEname(String ename) {
    11. this.ename = ename;
    12. }
    13. public void setGender(String gender) {
    14. this.gender = gender;
    15. }
    16. }

    下面是内部bean ,内部bean效率较高,但大多数人喜欢外部bean的写法

    1. <bean id="emp" class="com.atguigu.spring5.bean.Emp">
    2. <property name="ename" value="lucy">property>
    3. <property name="gender" value="女">property>
    4. <property name="dept>">
    5. <bean id="dept" class="com.atguigu.spring5.bean.Dept">
    6. <property name="dname" value ="安保部">property>
    7. bean>
    8. property>
    9. bean>

      注入属性-级联赋值 :

    1. <bean id="emp" class="com.atguigu.spring5.bean.Emp">
    2. <property name="ename" value="lucy">property>
    3. <property name="gender" value="女">property>
    4. <property name="dept>" ref="dept">property>
    5. bean>
    6. <bean id="dept" class="com.atguigu.spring5.bean.Dept">
    7. <property name="dname" value="财务部">property>
    8. bean>

    IOC 操作Bean管理(xml注入集合属性)

    • 注入数组类型属性
    • 注入List集合类型属性
    • 注入Map集合类型属性

    创建类,定义数组、list、map、set 类型属性,生成对应set方法

    1. public class Stu {
    2. //1. 数组类型属性
    3. private String[] courses;
    4. //2. list 集合类型属性
    5. private List list;
    6. //3. map 集合类型属性
    7. private Map map;
    8. //4. set 集合类型属性
    9. private Set sets;
    10. public void setSets(Set sets) {
    11. this.sets = sets;
    12. }
    13. public void setCourses(String[] courses) {
    14. this.courses = courses;
    15. }
    16. public void setList(List list) {
    17. this.list = list;
    18. }
    19. public void setMap(Map map) {
    20. this.map = map;
    21. }
    22. }

    在spring配置文件进行配置

    数组类型属性注入

    1. <property name="courses">
    2. <array>
    3. <value>java课程value>
    4. <value>数据库课程value>
    5. array>
    6. property>

    list 类型属性注入 

    1. <property name="list">
    2. <list>
    3. <value>张三value>
    4. <value>小三value>
    5. list>
    6. property>

    map 类型注入 

    1. <property name="map">
    2. <map>
    3. <entry key="JAVA" value="java">entry>
    4. <entry key="PHP" value="php">entry>
    5. map>
    6. property>

    set 类型属性注入 

    1. <property name="sets">
    2. <set>
    3. <value>MySQLvalue>
    4. <value>Redisvalue>
    5. set>
    6. property>

     集合类型属性注入

    1. <bean id="stu" class="com.atguigu.spring5.collectiontype.Stu">
    2. <property name="courses">
    3. <array>
    4. <value>java课程value>
    5. <value>数据库课程value>
    6. array>
    7. property>
    8. <property name="list">
    9. <list>
    10. <value>张三value>
    11. <value>小三value>
    12. list>
    13. property>
    14. <property name="map">
    15. <map>
    16. <entry key="JAVA" value="java">entry>
    17. <entry key="PHP" value="php">entry>
    18. map>
    19. property>
    20. <property name="sets">
    21. <set>
    22. <value>MySQLvalue>
    23. <value>Redisvalue>
    24. set>
    25. property>
    26. bean>

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

    创建多个course对象
    1. <bean id="course1" class="com.atguigu.spring5.collectiontype.Course">
    2. <property name="cname" value="Spring5框架">property>
    3. bean>
    4. <bean id="course2" class="com.atguigu.spring5.collectiontype.Course">
    5. <property name="cname" value="MyBatis框架">property>
    6. bean>
    注入list集合类型,值是对象
    1. <property name="courseList">
    2. <list>
    3. <ref bean="course1">ref>
    4. <ref bean="course2">ref>
    5. list>
    6. property>

    把集合部分注入提取出来

    在spring配置文件中引入名称空间until

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:p="http://www.springframework.org/schema/p"
    5. xmlns:until="http://www.springframework.org/schema/util"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    使用until标签完成list集合注入提取

    1. <until:list id="booklist">
    2. <value>JOJOvalue>
    3. <value>南计划value>
    4. <value>破解value>
    5. until:list>
    提取list集合类型属性注入使用
    1. <bean id="book" class="com.atguigu.spring5.collectiontype.Book">
    2. <property name="list" ref="booklist">property>
    3. bean>

    测试类

    1. @Test
    2. public void testCollection2(){
    3. ApplicationContext context =
    4. new ClassPathXmlApplicationContext("bean2.xml");
    5. Book stu = context.getBean("book", Book.class);
    6. stu.test();
    7. }

    输出

    1. public class Book {
    2. public List list;
    3. public void setList(List list) {
    4. this.list = list;
    5. }
    6. public void test(){
    7. System.out.println(list);
    8. }
    9. }

       

  • 相关阅读:
    AVS感知无损压缩标准概述——视觉无损质量等级视频浅压缩
    JavaScript之数组操作增删改、冒泡排序
    线性代数的本质(四)——行列式
    SAP ABAP基础知识 访问外部数据库-开发篇
    (十四)Alian 的 Spring Cloud 订单服务调用自动生成的API
    基于Redis(SETNX)实现分布式锁,案例:解决高并发下的订单超卖,秒杀
    2023年初中生古诗文大会初选正在进行中,详细参赛流程和实用建议
    机器学习笔记之最优化理论与方法(五)凸优化问题(上)
    P1314 [NOIP2011 提高组] 聪明的质监员-二分+前缀和
    rust字面量
  • 原文地址:https://blog.csdn.net/m0_57448314/article/details/128091436