zoukankan      html  css  js  c++  java
  • spring 基础(一) spring Ioc

    来源参考:Spring学习(1)——快速入门,网上视频。自己学习总结。书写此随笔是为了加深自己对spring Ico的理解

    1】spring基础

    Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AOP(Aspect Oriented Programming,面向切面编程)

    1. Spring可从狭义与广义两个角度看待:
    2. 广义的Spring是指Spring生态体系(spring colud、spring boot 、spring Framework等等)
    3. 狭义的Spring是指Spring框架(Spring Fremework)
      1.  Spring框架是企业开发复杂性的一站式解决方案
      2. Spring框架的核心是loC容器与AOP面向切面编程 
      3. Spring IoC负责创建与管理系统对象,并在此基础上扩展功能

    2】Ioc控制反转

    2.1】Ioc基础

    1. IoC控制反转,全称Inverse of Control,是一种设计理念
    2. 由代理人来创建与管理对象,消费者通过代理人来获取对象
    3. loC的目的是降低对象之间直接耦合
    4. 加入loC容器将对象统一管理,让对象关联变为弱耦合
    5. IoC容器是Spring生态的地基,用于统一-创建 与管理对象依赖
    6. 由程序本身,转嫁给第三方容器,通过这个容器统一对系统对象进行管理。此时容器就是spring ico容器 。

    2.2】spring 中常用术语

    1. 框架:是能完成一定功能的半成品。框架能够帮助我们完成的是:项目的整体框架、一些基础功能、规定了类和对象如何创建,如何协作等,当我们开发一个项目时,框架帮助我们完成了一部分功能,我们自己再完成一部分,那这个项目就完成了。
    2. 非侵入式设计:从框架的角度可以理解为:无需继承框架提供的任何类,这样我们在更换框架时,之前写过的代码几乎可以继续使用。
    3. 轻量级和重量级:轻量级是相对于重量级而言的,轻量级一般就是非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反
    4. JavaBean:符合 JavaBean 规范的 Java 类。
    5. POJO:即 Plain Old Java Objects,简单老式 Java 对象,它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色不继承或不实现任何其它Java框架的类或接口。
    6. bean 的各种名称——虽然 Spring 用 bean 或者 JavaBean 来表示应用组件,但并不意味着 Spring 组件必须遵循 JavaBean 规范,一个 Spring 组件可以是任意形式的 POJO。

    2.3】spring Ioc容器

    1. 对象的控制权交由第三方统一管理(IoC控制反转)
    2. 利用Java反射技术实现运行时对象创建与关联(DI依赖注入)
    3. 基于配置提高应用程序的可维护性与扩展性
    4. 低侵入 / 低耦合 (降低组件之间的耦合度,实现软件各层之间的解耦)
    5. 声明式事务管理(基于切面和惯例)
    6. 方便集成其他框架(如MyBatis、Hibernate)
    7. 降低 Java 开发难度
    8. Spring 能帮我们做什么
      ①.Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系
      ②.Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制
      ③.Spring 能非常简单的帮我们管理数据库事务
      ④.Spring 还提供了与第三方数据访问框架(如Hibernate、JPA)无缝集成,而且自己也提供了一套JDBC访问模板来方便数据库访问。
      ⑤.Spring 还提供与第三方Web(如Struts1/2、JSF)框架无缝集成,而且自己也提供了一套Spring MVC框架,来方便web层搭建。
      ⑥.Spring 能方便的与Java EE(如Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)。

    2.4】DI依赖注入

    1. loC是设计理念,是现代程序设计遵循的标准,是宏观目标
    2. DI(Dependency Injection)是具体技术实现,是微观实现
    3. DI在Java中利用反射技术实现对象注入(Injection)
    理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:
    1. 谁依赖于谁:当然是应用程序依赖于IoC容器;
    2. 为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
    3. 谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
    4. 注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

    2.5】spring Ioc maven

    <!--    考虑国内下载过慢的情况下,使用阿里云镜像-->
        <repositories>
            <repository>
                <id>aliyun</id>
                <name>aliyun</name>
                <url>https://maven.aliyun.com/repository/public</url>
            </repository>
        </repositories>
    
        <dependencies>
    <!--        spring ioc依赖-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.2.6.RELEASE</version>
            </dependency>
        </dependencies>

    2.6】Demo

    1. 首先创建mave项目
      1.    
    2. 添加maven依赖
      1.   
    3. 创建几个实体:例如apple
      1.   
    4. 创建:applicationContext.xml
      1.   
      2.  

    5. demo2,一个class对象中调用另外一个class(构造函数方式)
      1.   
    6. 加载配置文件说明:
      1.   加载单个
      2. 加载多个

    7. 路径表达式
      1.   
    8. 注意:applicationContext.xml中头部文件在 spring.io中找到
      1.   
      2. 复制到applicationContext.xml中之后注意单击这里

    2.7】关于spring和普通对比

      1.普通:New关键字在编译之前就将对象和对象之间进行强制的绑定,每次都需去程序修改-不宜维护

      2.spring:在配置文件中配置好,由于程序无关。利用反射特性

    2.8】Spring IoC 容器的设计

    Spring IoC 容器的设计主要基于以下两个接口:BeanFactory、ApplicationContext。

    其中 ApplicationContext 是 BeanFactory 的子接口之一,换句话说:BeanFactory 是 Spring IoC 容器所定义的最底层接口,而 ApplicationContext 是其最高级接口之一,并对 BeanFactory 功能做了许多的扩展,所以在绝大部分的工作场景下,都会使用 ApplicationContext 作为 Spring IoC 容器。

    2.8.1】BeanFactory

    BeanFactory 位于设计的最底层,它提供了 Spring IoC 最底层的设计

    在org.springframework:spring-beans 下

     BeanFactory拥有以下几个方法:

    介绍几个常用的方法

    1. getBean:对应了多个方法来获取配置给 Spring IoC 容器的 Bean。  
      1. 按照类型拿 bean:
        bean = (Bean) factory.getBean(Bean.class);
        注意:要求在 Spring 中只配置了一个这种类型的实例,否则报错。(如果有多个那 Spring 就懵了,不知道该获取哪一个)

      2. 按照 bean 的名字拿 bean:

        bean = (Bean) factory.getBean("beanName");
        注意:这种方法不太安全,IDE 不会检查其安全性(关联性)

      3. 按照名字和类型拿 bean:(推荐)

        bean = (Bean) factory.getBean("beanName", Bean.class);

    2. isSingleton:用于判断是否单例,如果判断为真,其意思是该 Bean 在容器中是作为一个唯一单例存在的。而【isPrototype】则相反,如果判断为真,意思是当你从容器中获取 Bean,容器就为你生成一个新的实例。注意:在默认情况下,【isSingleton】为 ture,而【isPrototype】为 false
    3. getAliases:方法是获取别名的方法

    2.8.1】ApplicationContext

    允许容器通过应用程序上下文环境创建、获取、管理bean。为应用程序提供配置的中央接口。在应用程序运行时这是只读的,但如果实现支持这一点,则可以重新加载。

    所在位置以及拥有的方法:

    一个ApplicationContext提供:

    1. 访问应用程序组件的Bean工厂方法。从org.springframework.beans.factory.ListableBeanFactory继承。
    2. 以通用方式加载文件资源的能力。继承自org.springframe .core.io。ResourceLoader接口。---beanXML
    3. 向注册侦听器发布事件的能力。继承自ApplicationEventPublisher接口。
    4. 解析消息的能力,支持国际化。继承自MessageSource接口。
    5. 从父上下文继承。后代上下文中的定义总是优先级。例如,这意味着单个父上下文可以被整个web应用程序使用,而每个servlet都有自己独立于任何其他servlet的子上下文。
    6. 其接口主要子类(接口)包括:ConfigurableApplicationContext、WebApplicationContext
      1. ConfigurableApplicationContext:该接口提供了根据配置创建、获取bean的一些方法,其中主要常用的实现包括:ClassPathXmlApplicationContext、FileSystemXmlApplicationContext等。提供了通过各种途径去加载实例化bean的手段。
  • 相关阅读:
    封装成帧、帧定界、帧同步、透明传输(字符计数法、字符串的首尾填充法、零比特填充的首尾标志法、违规编码法)
    计算机网络之数据链路层的基本概念和功能概述
    物理层设备(中继器、集线器)
    计算机网络之传输介质(双绞线、同轴电缆、光纤、无线电缆、微波、激光、红外线)
    计算机网络之编码与调制
    0953. Verifying an Alien Dictionary (E)
    1704. Determine if String Halves Are Alike (E)
    1551. Minimum Operations to Make Array Equal (M)
    0775. Global and Local Inversions (M)
    0622. Design Circular Queue (M)
  • 原文地址:https://www.cnblogs.com/1439107348s/p/14271070.html
Copyright © 2011-2022 走看看