Spring学习笔记_kuangshenshuo

1 Spring

1.1 简介

  • Spring:春天——> 给软件行业带来了春天
  • 2002,首次推出spring框架的雏形:interface21框架!
  • Spring框架以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日,发布了1.0正式版。
  • Spring理念 : 使现有技术更加使用. 本身就是一个大杂烩 , 整合现有的框架技术。
  • Spring是一个开源的轻量级的一站式容器框架
    • spring在javaweb三层结构中,每一层都提供了解决技术
      1. web层:springmvc
      2. 业务层:ioc和声明式事务aop
      3. 持久层:jdbctemplate
  • Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)

1.2 优缺与核心

  1. 优点

    • Spring是一个开源免费的框架 , 容器 .
    • Spring是一个轻量级的框架 , 非侵入式的 .
    • 支持面向接口编程
    • 管理整个项目,兼容其他优秀框架
    • 提供众多服务,例如:事务管理
    • 优秀的web框架的springmvc替代struts2
  2. 缺点

    • 控制器过于灵活,缺少一个公用的控制器,jsp代码量过大
    • 不支持分布式,造成 ejb 目前还在使用
  3. Spring核心只有两部分

    1. ioc:控制反转
    2. aop:面向切面编程

1.3 组成

Spring学习笔记_kuangshenshuo

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

  • 核心容器(Spring Core):核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 ,它是工厂模式的实现。 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  • Spring 上下文(Spring Context):Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
  • Spring面向切面编程(Spring AOP):通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
  • Spring DAO模块:JDBC,DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  • Spring ORM模块:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  • Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

1.4 拓展

在Spring的官网有这个介绍:现代化的Java开发!说白了就是基于Spring的开发!

Spring学习笔记_kuangshenshuo

IOC 和 DI 的区别

  1. IOC
    1. 传统方式在程序中创建对象并且在对象内部创建依赖对象,是程序主动创建了依赖关系,这种依赖方式被称为主动依赖
    2. IOC 方式把创建对象及对象之间关系的维护的权限转交给spring 容器管理,它提供一个第三方的工厂,这个工厂你要什么,它就给你提供什么,IOC 方式创建对象不需要 new
      • 谁控制谁:IOC 容器控制了对象
      • 控制了什么:控制了对象的创建,关系,生命周期及文件
      • 哪些方面反转了:依赖的对象被反转了
      • 为何是反转:有了反转就有正转,正传是程序主动创建依赖关系及对象,而反转是容器帮我创建了依赖对象及依赖关系,对象被动被注入了依赖对象
  2. DI(Dependency Injection)
    • 谁依赖于谁:程序依赖了IOC 容器
    • 为什么需要依赖:程序需要IOC 容器提供的对象及资源
    • 谁注入谁:容器注入了对象及依赖对象还要它们的关系
    • 注入了什么:对象的依赖对象,资源,常量等
  3. IOC 和 DI 的关系
    • DI 是建立在IOC 基础之上,DI 强调是关系,DI 不能单独存在

2.1 IOC的推理

1.UserDao接口

2.UserDaoImpl实现类

3.UserService业务接口

4.UserServiceImpl业务实现类

在之前的业务中,用户的需求(DaoImpl)可能会影响我们原来的代码(ServiceImpl),我们需要根据用户的需求的修改原来的代码,如果程序代码量大,修改一次的成本十分昂贵

Spring学习笔记_kuangshenshuo
这种思想,从本质上解决了问题,我们程序猿不用再去管理对象的创建,系统耦合性降低 ,可以更加专注在业务的实现上 ,这就是IOC的原型

2.2 IOC的本质

  • 控制反转IOC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IOC的一种方法,也有人认为DI只是IOC的另一种说法。

  • 没有IOC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,

    • 对象的创建由程序 自己 控制,控制反转后将对象的创建转移给第三方
  • 个人认为所谓控制反转就是:获得依赖对象的方式反转了。

    Spring学习笔记_kuangshenshuo
  • IOC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。

    • 采用**XML**方式配置Bean的时候,Bean的定义信息是和实现分离的,
    • 而采用**注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置**的目的。
    • 控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是**依赖注入**(Dependency Injection,DI)。

思考

  • Hello 对象是谁创建的 【 hello 对象是由Spring创建的 】
  • Hello 对象的属性是怎么设置的 【hello 对象的属性是由Spring容器设置的 】

这个过程就叫控制反转 :

  • 控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的

  • 反转 : 程序本身不创建对象 , 而变成被动的接收对象 .

  • 依赖注入 : 就是利用set方法来进行注入的.

  • IOC是一种编程思想,由主动的编程变成被动的接收

  • 我们彻底不用在程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改。

  • 所谓的IOC:对象由Spring来创建,管理,装配!

2.3 IOC的原理

  1. xml 文件

  2. 流(WritableResource)

  3. 解析xml 文件(BeanDefinitionParserDelegate)

  4. 工厂设计模式(AbstractBeanFactory)

  5. 反射(InstantiationStrategy)

  6. 分析 IOC 原理

    • 传统方式
      Spring学习笔记_kuangshenshuo
  • Spring容器的原理,其实就是通过解析xml文件,或取到用户配置的bean,然后通过反射将这些bean挨个放到集合中,然后对外提供一个getBean()方法,以便我们获得这些bean。下面是一段简单的模拟代码:
  • 首先声明一个存放bean的Map,然后通过jdom解析配置文件,循环遍历所有的节点,并通过反射将它们放到我们之前声明的Map中。然后提供一个getBean()的方法,让我们可以通过bean的Id来找到我们想要的bean。

  • 客户端通过调用前面的ClassPathXmlApplicationContext,来加载上面的配置文件,然后就可以通过Id来获得我们需要的bean了

2.4 IOC创建对象的方式

bean 的实例化三种方式

  1. 调用无参数构造器

    Spring学习笔记_kuangshenshuo
  2. 静态工厂

    Spring学习笔记_kuangshenshuo
  3. **实例工厂 **

    Spring学习笔记_kuangshenshuo
  4. 使用无参构造创建对象,默认!

  5. 假设我们要使用有参构造创建对象。

    1. 下标赋值
    1. 类型
    1. 参数名
     bean id="user" class="com.yan.pojo.User"来源:这把稳赢
                                                            

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年7月7日
下一篇 2021年7月7日

相关推荐