• Spring框架——Ioc、DI与Spring框架


    Ioc、DI

    引入

    实现某功能的方法:

    1. 面向对象
      • 类与类存在调用关系
      • 存在依赖,高耦合
    2. 分离接口
      • 将被调用的类作为接口实现
      • 通过调用接口来调用类
      • 降低耦合度(依赖)
    3. 容器实现
      • 将类与接口的实现类放入容器中,通过容器来获取
      • 实现了解耦
      • 问题:
        • Container容器对所管理的所有组件产生了依赖
        • 类对容器产生依赖,封装具有查找逻辑
    4. 服务定位器 (JNDI) (体现了IOC原则)
      • 封装查找逻辑,对外公开查找组件的方法
        • 应用服务定位器将查找逻辑从组件里分离出来
        • 降低组件在查找方面的复杂性
        • 增加组件的重用性
      • 局限性:组件必须知道怎么找资源
    5. 控制反转(根据 3.容器实现 进行Ioc)(体现了IOC原则)
      • 不需要服务定位器
      • 由容器将组件注入到另一个组件
      • 完全面向接口

    概念

    Ioc 控制反转 [Inversion of Control]

    目的:设计原则,解耦组件之间的依赖关系。降低耦合度
    好处:

    1. 从主动获取资源变成 被动接收
    2. 查找的被动形式

    B、C类具有相同的方法、不同的实现。A类需要调用B或C类的方法

    • 主动:A类主动获取B或C的对象,想要谁要谁
    • 被动:容器给A类哪个类,A类就必须用哪个类
      聪明的小伙伴应该已经理解了,没错,就是自由恋爱包办婚姻的区别。

    DI 依赖注入 [Dependency Injection]

    具体的设计模式,体现Ioc设计原则
    DI是Ioc的最典型的实现,不能混用

    DI用法

    DI 依赖注入的类型

    1. 接口注入
    2. setter注入[Spring实现]
      • 缺点:会忘记注入
      • 抛出空指针
    3. 构造器注入[Spring实现]
      • 避免了setter注入 的缺点
      • 没有明确含义的方法名,对参数位置、数量有要求

    流行程度最广

    setter注入

    框架

    什么是框架

    已经对基础的代码进行了封装并提供相应的API,开发者在使用框架是直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度。

    框架

    • netty
    • mina
    • luence

    Spring框架

    创作人:Rod Johnson

    Spring Ioc容器

    Spring容器体现了IoC原理

    Spring容器通过读取配置元数据负责对Beans实例化、配置、装配

    Beanfactory

    简介

    • 提供一个先进配置机制,能够管理任何类型的对象
    • 负责对Bean对象实例化装配生命周期的管理

    实现Beanfactory

    1. Beanfactory为接口,需要用XmlBeanFactory实现类
    2. XmlBeanFactory需传入一个Resource实例
      • ClassPathResource
      • FileSystemResource
    BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
    
    1. 从BeanFactory获取Bean实例
      MyBean bean = (MyBean)factory.getBean("myBean"); 

    ApplicationContext

    简介

    ApplicationContextBeanfactory 的子接口,提供更多更全面的功能

    添加了更多的企业特定的功能

    • 更方便的集成Spring的AOP功能
    • 消息资源处理
    • 事件的发布

    实现类

    • ClassPathXmlApplication xml通过路径
    • FileSystemXmlApplication xml放在文件系统中
    • XmlWebApplicationContext 基于web程序的xml实现类
    • AnnotationConfigApplicationContext 注解

    BeanFactoryApplicationContext区别:

    1. BeanFactory提供了配置框架和基本功能,ApplicationContext添加了更多的企业特定功能
    2. ApplicationContextBeanFactory的一个子接口,也是一个完整的超集
    3. 两者实例化Bean的载入方式不同
      • BeanFactory延迟载入所有Bean,直到getBean()方法调用时才被创建
      • ApplicationContext启动后载入所有单例Bean,通过预载入单实例Bean,确保当需要时使用

    配置元数据

    元数据:通过容器使用配置来反应Beans和他们之间的依赖关系

    1. 基于Xml的配置

    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
    	<!-- xml配置 -->
    	
    	<!-- id叫什么都可以 -->
    	<!-- class为完整的包名+类名 -->
    	<bean id="IntelCpu" class="com.pc.IntelCpu"></bean>
    	
    	<!-- 依赖注入 -->
    	<!-- ref对应依赖注入id -->
    	<bean id="Computer" class="com.pc.Computer">
    		<property name="cpu" ref="IntelCpu"></property>
    	</bean>
    	
    </beans>
    
    1. 基于注解的配置

    在xml文件中进行注解配置

    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    	
    	<!-- 注解配置  -->
    	<context:annotation-config /> 
    	<context:component-scan base-package="com.pc"></context:component-scan>
    	
    </beans>
    

    在类中加入注解

    注解
    依赖组件类 @Component
    调用依赖类 @Component("Computer")
    依赖组件 @Resource

    @@Component默认将类名小写,可以通过@Component("Computer")进行自定义

    1. 基于java的配置

    注解类的注解不变
    在测试类注解

    @Configuration
    @ComponentScan("包名")
    

    调用

    ApplicationContext ac = new AnnotationConfigApplicationContext();
    //类 class = (类)ac.getBean("注解的类名字");
    //class.方法();
    

    每日英语()

    annotation 注解
    application 应用
    component 组件
    config 配置
    configuration 配置
    context 上下文环境
    property 财产、所有权
    scan 扫描、浏览

  • 相关阅读:
    【力扣 089】24. 两两交换链表中的节点
    【力扣 086】19. 删除链表的倒数第 N 个结点
    【力扣 085】2. 两数相加
    【力扣 093】92. 反转链表 II
    【力扣 090】25. K 个一组翻转链表
    【力扣 091】61. 旋转链表
    【力扣 088】23. 合并K个升序链表
    【力扣 087】21. 合并两个有序链表
    【力扣 092】82. 删除排序链表中的重复元素 II
    vim命令
  • 原文地址:https://www.cnblogs.com/occlive/p/13538735.html
Copyright © 2020-2023  润新知