栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Spring5:IOC的使用及原理解析】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Spring5:IOC的使用及原理解析】

Spring中的IOC容器 一、IOC底层原理与概念
  • 什么是IOC
    • 控制反转,将 对象创建 和 对象之间的调用过程 教给Spring
    • 目的:为了降低耦合度
  • IOC底层原理
    • xml解析
    • 工厂模式
    • 反射
    原方式: 演变->工厂设计模式:

    IOC现有过程:

    利用xml解析:获取文件路径

    反射:通过Class.forName(路径)获取创建对象

二、IOC接口(BeanFactory)
  • IOC思想基于IOC容器完成,IOC底层就是对象工厂
  • Spring提供IOC的实现接口
    • ApplicationContext
      • BeanFactory接口的子接口
      • 提供更加多的功能,供开发人员使用
      • 特点:加载配置文件xml的时候直接创建对象
    • BeanFactory
      • IOC容器最基本的实现方式(Spring内部进行使用,不提倡开发人员使用)
      • *特点:加载配置文件xml的时候不会创建对象,获取对象的时候才创建配置文件
  • ApplicationContext的扩展接口实现类
    • ClassPathXmlApplicationContext:对应src下的工程路径
    • FileSystemXmlApplicationContext:电脑盘中的绝对路径
    • ConfigurableApplicationContext:扩展实现功能

三、IOC操作Bean管理 基于xml(底层原理机制,直接使用请跳过直接看 四)
  • Bean管理操作
    1. Spring创建对象
    2. Spring注入属性
  • 基于xml方式 创建对象
    • 在Spring配置文件中使用bean标签,标签添加对应内容,既可实现创建

    • bean标签属性

      • *id:对象的唯一标识
      • *class:类的全路径
    • 创建对象的时候,默认执行无参构造方法

  • 基于xml方式 注入属性*
    • DI:依赖注入,就是注入属性

      • 第一种方式:利用setter方法进行注入

        • 创建setter方法
        public void setAge(int age) {
            this.age = age;
        }
        
        public void setName(String name) {
            this.name = name;
        }
        
        • Spring配置文件中
        
        
            
            
            
        
        
      • 第二种方式:利用有参构造注入

        
            
                
                
            
        
      • 设置空值()

       
       
       
      
      • 注入外部bean属性*

        • 例如:在Service层调用Dao层的实现类(方法同上)

        • 1.创建属性

          [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MKoN2dwG-1658987323531)(https://s2.loli.net/2022/07/28/PXbnizYeEC2sGqS.png)]

        • 2.使用 ref 配置xml文件

          [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YncwlIid-1658987323532)(https://s2.loli.net/2022/07/28/aBJsqhUMRSPgorY.png)]

      • 注入内部bean

        • 内部bean:例如bean中有一对多关系:一个部门多个员工

          • 1.在bean中写好属性

          • 2.利用setter方法添加属性

      • 注入集合属性

        • 例如:有一个times类型的属性为int数组类型

          
          
              
                  1
                  10
                  11
                  
              
          
          
        • 例如:有一个times类型的属性为对象(Course)数组类型

        • 将集合抽取,变为共有属性,需要时调用

        • 
          
              dasda
              wqeqweqw
          
          
          
          
    • 工厂Bean的使用

      • 普通bean只能返回指定的类型
      
      
      
      //得到返回类型也是User
      User user = context.getBean("user", User.class);
      
      • 在xml里定义的bean类型可以和返回类型不一样

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LmqeitKR-1658987323533)(https://s2.loli.net/2022/07/28/4o1tbJlHq9sQijK.png)]

      其余步骤和xml配置一致

  • Bean的作用域
    • 在Spring中可以设置bean的实例是单实例还是多实例对象

      • 单实例:两次根据xml创建地址相同**(默认singleton)**

      • 多实例:两次根据xml创建地址不同**(prototype)**

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XIr3LHHF-1658987323534)(https://s2.loli.net/2022/07/28/puDrEomN8dwKYCz.png)]

      • 放入到request或session中**(request/session)**

  • Bean的 生命周期
    1. 通过构造器创建bean实例(无参构造器中)

    2. 设置bean的属性和其他bean的引用(set方法中)

    3. 调用bean的初始化方法(需要进行配置)

    4. bean可以正常调用

    5. 容器关闭的时候,调用销毁方法(需要进行配置)

      //1.加载配置文件
      ApplicationContext context
      =new ClassPathXmlApplicationContext("Bean1.xml");
      context.close();
      

  • xml 的自动装配

    • 定义:根据属性 名称 或 类型,Spring自动将匹配的属性注入

      • 根据名称**(byName),bean的id值和属性名称一样**

      • 根据类型**(byType)**

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-weHNXaBB-1658987323536)(…/…/myimage/image-20220720095951759.png)]

  • 外部属性文件
    • 对比:直接配置数据库信息

      
      
          
          
          
          
      
      
    • 从外部属性文件配置数据库连接池

      1. 将Properties文件引入Spring配置

        • 引入context名称空间

      2. 引入外部文件

四、IOC操作Bean管理 基于注解
  • 注解示例
    @myAnnotation(name="川泽")
    
    • 使用注解 可以简化xml配置
  • Spring针对Bean管理中创建对象的注解
    1. @Component**(普通注解)**

    2. @Service**(建议在Service层)**

    3. @Controller**(建议在Web层)**

    4. @Repository**(建议在Dao层)**

      上面四个注解功能一样,都可以创建bean实例

  • 注解 创建Bean对象
    1. 引入Aop包

    2. 开启组件扫描

      • 方式一

      • 方式二

        
            
        
            
        
        
    3. 创建类后在类上添加注解

      @Service(value = "userService") //相当于
      public class UserService {
          public void add_(){
              System.out.println("add");
          }
      }
      
  • Spring针对Bean管理中 注入属性的注解
    1. @Autowired:根据属性类型进行自动装配

    2. @Qualifier:根据属性名称进行注入

      • (需要和@Autowired一起使用)

        @Autowired//自动装配属性
        @Qualifier(value = "userDaoImp")//名称限制
        private UserDao userDao;
        
    3. @Resource:可以根据类型注入,可以根据名称注入(不推荐)

      @Resource//自动装配属性
      @Resource(value = "userDaoImp")//名称限制
      private UserDao userDao;
      
    4. @Value:注入普通类型

      @Value(value = "1")
      Integer a;
      
  • 注解 注入属性
    1. 创建属性

    2. 在Service层注入到对象,在属性上面使用注解

  • 纯注解开发(SpringBoot应用)
    1. 创建测试类,代替xml

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qnCARVTA-1658987323540)(https://s2.loli.net/2022/07/28/ALyuVvrj1XRBWHk.png)]

    2. 添加配置注解

    3. 调用时函数与 xml有所不同

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C0bYtBJG-1658987323541)(https://s2.loli.net/2022/07/28/eOSxLB2obQZuGYU.png)]

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1032018.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号