• Spring之IOC思想


    前言

    现实生活我们需要的的电脑来自于工厂,需要的水杯来自于工厂;

    SpringIOC容器就相当于1个万能加工厂,可以创造出各式各样的对象;

    我们只需要向这个万能工厂提交需求参数,索要对象即可。

    Spring IOC容器通过接口+工厂模式,实现了程序中调用方和被调用方的解耦,使我们可以构建出高内聚、低耦合的Web应用;

    一、Spring介绍

    Spring的核心是

    • IOC:  Inverse Of Control即反转控制
    • AOP:Aspect Oriented Programming即面向切面编程)

    1.Spring特点

    Spring功能大而全:相当于Python中的Django,在Web 3层架构中都有自己的解决方案

    • web层 :    Springmvc
    • service层 : Spring
    • dao层 : SpringJdbc

    轻量级:只启动Spring核心容器的时候,占用的内存少,耗费的资源少

    开源:源代码开放

    2.Spring架构图

    二、Spring IOC

    从整个Spring架构图中看到Core Container是整个Spring框架的地基;

    Core Container也叫Spring IOC容器;

    SpringIOC容器包含:Beans、Core、Context、SpEL;

    接下来将从Spring的地基开始慢慢渗透学习Spring框架;

    1.SpringIOC介绍

    被调用方实现类对象的创建由原来的调用方使用new关键字创建转变成了从工厂中获取,而被调用方实现类对象的创建过程由工厂内部来实现

    而这个工厂就是Spring的IOC容器,也就是以后调用方调用被调用方的对象不再自己创建,而是直接向SpringIOC容器要,这种思想就是控制反转即IOC;

     

    2. IOC(控制反转)思想

    控制反转:是一种设计思想,它的目的是指导我们设计出更加松耦合的程序;

    控制:指的是被调用方对象的控制权,现在可以简单理解为被调用方实现类对象的创建权;

    反转:指被调用方实现类对象的控制权,由调用方主动控制(new),反转为由SpringIOC容器代为创建和控制;

    Spring IOC 容器的本质:切换和反转了被调用方实现类对象的获取方式,由调用方直接new,变成了调用方间接向SpringIOC容器要;

    控制反转的前提:Spring配置文件中,已经配置了调用方需要的被调用方实现类

     

    3.Spring IOC应用

    使用Spring的IOC容器实现service层(调用方)和dao层(被调用方)的解耦;

    <?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
            https://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--
            声明当前springIOC要创建的对象
           id:创建好的对象放入SpringIOC容器之后的标识
           class:创建本对象需要使用的实现类
          -->
        <bean id="UserDao" class="com.zhanggen.dao.impl.UserDaoImpl">
            <!-- collaborators and configuration for this bean go here -->
        </bean>
    
    
    </beans>
    applicationContext.xml

     ------------------------------------------------------------------------------------------

    package com.zhanggen.sercive.impl;
    
    import com.zhanggen.dao.UserDao;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class UserServiveImpl {
        //测试从springIOC容器中获取dao层实现类对象
        @Test
        public void test1() {
            //1.读取配置文件,初始化SpringIOC容器
            ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
    
            //2.从SpringIOC容器中获取对象,并调用对象的方法
            UserDao userDao = (UserDao) act.getBean("UserDao");
            userDao.save();
        }
    }
    UserServiveImpl.java

    4.Spring IOC相关API

    4.1.两个接口

    BeanFactory和ApplicationContext接口功能有哪些不同? 

    A.BeanFactory

    这是SpringIOC容器的顶级接口,它定义了SpringIOC的最基础的功能,但是其功能比较简单,一般面向Spring自身使用
    BeanFactroy在第1次使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化

    B.ApplicationContext

    这是在BeanFactory基础上衍生出的接口,它扩展了BeanFactory的功能,一般面向程序员使用
    ApplicationContext是在容器启动时,一次性创建并加载了所有的Bean;

    注意: 上面两种方式创建的对象都是单例,只是创建对象的时机不同

    4.2.三个实现类

    这三个实现类的作用都是:读取配置文件, 初始化Spring的IOC容器, 不一样的是加载配置文件的位置

    • ClassPathXmlApplicationContext 读取类路径下的xml作为配置文件
    • FileSystemXmlApplicationContext 读取本地目录下的xml作为配置文件
    • AnnotationConfigApplicationContext 读取一个注解配置作为配置文件

    4.3.一个方法 

    getBean() 用于从Spring容器中获取Bean对象,参数可以使用三种情况:

    • getBean("id") 使用bean的id从容器中查找对象
    • getBean(Bean.class) 使用bean的class类型从容器中查找对象
    • getBean("id", Bean.class) 使用bean的id 和 class类型从容器中查找对象

    参考

  • 相关阅读:
    LOJ 10160
    LOJ 10155
    2018-11-1 NOIP 模拟赛解题报告
    联考前停课集训随笔
    一个博客园代码高亮的方案
    详解使用 Tarjan 求 LCA 问题(图解)
    NOIP2018普及初赛解析
    关于CCR测评器的自定义校验器(Special Judge)
    日常,异常处理
    Androidstudio 编译慢 这样的体验肯定很多人都有!!!
  • 原文地址:https://www.cnblogs.com/sss4/p/16280982.html
Copyright © 2020-2023  润新知