• Spring (IoC、AOP和事务)运行原理


    一、Spring 的开源框架

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

    二、Spring 的基本概念

    1. Spring 是开源的轻量级框架,开源是对外开放源码,轻量级是不需要依赖其他框架就可以使用
    2. Spring 的两个核心:
      1. 面向切面(Aop:Aspect oriented Programming):扩展功能不是修改源代码实现,我的理解AoP已经将这些公共的可重用的模块(aspect)抽离出来(比如安全/日志/事务等),封装成一个切面,然后我们在扩展功能时只需要将这些注入到目标对象中(切面),这时候只需要考虑我们自己的业务逻辑即可。
      2. 控制反转(IoC:Inversion of Control):它是一种设计思想,就是通过容器控制应用程序需要的外部资源的创建和管理(.xml中配置),然后将其反转给应用程序,对象及其依赖对象的创建和维护都不需要应用程序去实现,将其交给IoC去管理。比如有一个类,类里面有一个方法(不是静态方法),要调用这个类里面的方法,需要创建类对象(new)才可以访问这个方法,现在不需要通过new对象,而是交给Spring进行配置给他创建类的对象。
    3. Spring 是一站式框架
      1. Spring 在JavaEE 三层结构中,每一层都提供不同的解决方案
        1. web 层(表现层):SpringMVC
        2. service 层(业务逻辑层):Spring 的IoC 和AOP
        3. dao 层(持久层):Spring 的JDBCTemple
    4. Spring 框架的六大模块:

      

    1. Spring DAO: Spring提供了对JDBC的操作支持:JdbcTemplate模板工具类 。
    2. Spring ORM:Spring可以与ORM框架整合。例如Spring整合Hibernate框架,其中Spring还提供HibernateDaoSupport工具类,简化了Hibernate的操作 。
    3. Spring WEB:Spring提供了对Struts、Springmvc的支持,支持WEB开发。与此同时Spring自身也提供了基于MVC的解决方案 。
    4. Spring AOP:Spring提供面向切面的编程,可以给某一层提供事务管理,例如在Service层添加事物控制 。
    5. Spring JEE:J2EE开发规范的支持,例如EJB 。
    6. Spring Core:提供IOC容器对象的创建和处理依赖对象关系 。

    三、Spring 的IoC 的创建

    1. 把对象的创建直接交给Spring进行管理
    2. IoC操作两部分
      1. IoC 的配置方式
      2. IoC 的注解方式
    3. IoC 的底层原理
      1. xml 的配置文件
      2. dom4j 解析xml
      3. 工厂设计模式
    4. 反射

    四、Spring 的Bean 管理(xml 方式,不推荐)

    1. Bean 实例化的方式
      1. 在Spring 里面通过配置文件创建对象
      2. Bean 实例化的三种方式
        1. 使用类的的无参构造创建
        2. 使用静态工厂创建
        3. 使用实例工厂创建
      3. Bean 标签常用的属性
        1. id 属性: 起的名称,id 属性值名称任意值,但不能有特殊值
        2. class 属性:创建对象所在类的全路径
        3. name 属性:功能和id 属性一样的,但是可以包含特殊符号(现在基本不用了,以前Struct1 会用)
        4. scope 属性:有多个属性值,1)singleton 单例,默认值   2)prototype 多例的
      4. Bean 的属性注入
        1. 创建对象时向类里面的属性设置值
        2. 属性注入的方式介绍(三种方式:set 方法注入;有参构造注入;使用接口注入)

        3. 在Spring 的框架中只支持前两种方式
          1. set 方法注入
          2. 有参构造注入
          3. 注入对象类型属性(重点)
            1. 创建service 类和 dao 类
            2. 在service 中把定义一个dao 类型的属性
          4. P 名称空间的注入

          5. 注入复杂类型:数组,list 集合,map 集合,properties文件
          6.  
    2. IoC 和DI 区别
      1. IoC:控制反转,把对象创建交给Spring 配置
      2. DI:依赖注入,向类里面的属性设置值
      3. 关系:依赖注入不能单独存在,DI 需要在IoC 的基础之上完成操作
    3. Spring 整合Web 项目原理
      1. 加载Spring 核心配置文件
        1. new 对象功能可以实现,但是效率很低
      2. 实现思想:把加载配置文件和创建对象过程,在服务器启动时完成
      3. 实现原理:1)ServletContext 对象  2)监听器
        1. 具体实现 --在服务器启动时为每个项目创建一个ServletContext 对象
                                                --在ServletContext 对象创建时候,使用监听器可以具体到ServletContext 对象在什么时候创建
                                                --使用监听器听到ServletContext 对象创建时
                                                --加载Spring 配置文件,把配置文件配置对象创建
                                                --把创建出来的对象放到ServletContext 域对象中(setAttribute 方法)
                                                --获取对象的时候,到ServletContext 域对象中得到(getAttribute 方法)

    五、Spring 的Bean 管理(注解,推荐)

    • 注解  1)代码里面特殊的标记,使用注解可以完成功能  2)注解写法 @注解名称(属性名称=属性) 3)可以使用在类/方法/属性上面
      • Spring 的注解的使用
      1. 导入基本jar 包
      2. 导入Aop jar 包
      3. 创建类,创建方法
      4. 创建Spring 配置文件,引入约束
        1. 引入beans 之外还需要新的contexts 约束
        2. 在xml 添加需要扫描的包
      5. 使用注解创建对象
        1. 使用注解创建对象一共有四个:
        2. 创建对象单实例和多实例
      6. 注解方式注入属性
        1. 创建service 类,创建dao 类,在service 类中注入dao对象,有@Autowired
        2. 在service 类里面定义dao 类型属性1)用@Autowired
          2)用@Resource
      7. 配置文件和注解混合使用
        1. 创建对象使用配置文件方式实现
        2. 注入属性使用注解方式实现

    ps:

    spring注解的作用:

    1、spring作用在类上的注解有@Component、@Responsity、@Service以及@Controller;而@Autowired和@Resource是用来修饰字段、构造函数或者设置方法,并做注入的。

    2、当注解作用在类上时,表明这些类是交给spring容器进行管理的,而当使用@Autowired和@Resource时,表明我需要某个属性、方法或字段,但是并不需要我自己去new一个,只需要使用注解, spring容器会自动的将我需要的属性、方法或对象创造出来。这就是通常所说的依赖注入和控制反转。

    六、AOP

    1. AOP的概念:面向切面编程,扩展功能不是修改源代码实现。采取横向抽取机制,取代了传统的纵向机制(纵向继承重复性代码)
      1. 纵向机制(以前)
      2. 横向机制(现在)  1)有接口实现
                                2)没有接口实现
      3. 基本术语:
        1. JoinPoint 连接点:类里面哪些方法可以被增强,这些方法就是连接点
        2. Pointcut 切入点:在类里面有很多方法可以被增强,比如实际操作中,只增强了add()方法,那么add 方法就是切人点
        3. Advice 通知/增强:增强逻辑,称为增强,比如扩展日志功能,这个功能的逻辑就是增强:
          1. 前置通知:在add 方法之前
          2. 后置通知:在add 方法之后
          3. 异常通知:方法出现异常时增强
          4. 最终通知:方法之后的后置之后执行
          5. 环绕通知:计算方法时间,方法前后都执行
        4. Aspect 切面:把增强应用到具体的方法上,这个过程就叫切面
    2. Spring 的AOP 操作
      1. 在Spring 里面进行AOP 操作用的是AspectJ 实现
        1. AspectJ 不是Spring 的一部份和Spring 一起进行aop 操作
        2. Spring 2.0 以后新增了对AspectJ 支持
    1. 使用AspectJ 实现AOP 的两种操作
      • 操作基本准备,导入jar 包
      • 创建Spring 核心配置文件,导入AOP 的约束
      • 开发中需要引入的约束 
      1. 基于AspectJ 的xml 配置方式


      2. 基于AspectJ 的注解方式

    七、Log4J 介绍

      • 通过Log4J 可以看到程序运行过程中更详细的信息
        • 导入Log4J jar 包
        • 复制配置文件复制到src 中
        • 最后一个log4j.rootLogger 1)info:可以看到基本信息  2)debug:可以看到更详细的信息

    八、Spring 整合Web 项目演示

      1. action 调用service,service 调用dao
      2. 每次访问都加载配置文件,影响性能
      3. 解决方案:
        1. 在服务器启动时就创建加载配置文件
        2. 底层使用监听器,ServletContext 对象
      4. 在Spring 中不需要我们自己写代码实现
        1. 配置监听器前导入Spring 的web jar 包 spring_web_4.2.2_RELEASE.jar 
        2. 封装了监听器,我们只需要配置监听器就可以了
        3. 在web.xml 用listener 配置监听器
        4. 指定需要加载的Spring 配置文件的位置

    九、Spring 配置C3P0 

      • 配置c3p0 连接池 
      • 使用jdbcTemplate
      • 利用dataSource注入

    十、Spring 的事务api 介绍

    • 事务的概念:1)什么时事务 2)事务的特性 ACID: 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)  3)不考虑事务会产生读的什么问题?(幻读,脏读,不可重复读)--》设置隔离性,多个事务之间不会产生影响
    • 事务管理:两种
      1. 编程式事务管理
      2. 声明式事务管理
        1. 基于xml 配置实现
        2. 基于注解方式
      3. Spring 进行事务管理的API:接口 PlatformTransactionManager 事务管理器
        1. Spring 针对不同的dao 框架提供不同的接口实现类
        2. 无论是配置文件还是注解都需要配置事务管理器,根据实现类创建对象
      4. 搭建转账来实现事务一致性,小王少1000,小李多1000
        1. 创建表,添加数据
        2. 创建service 和 dao 类,完成注入关系
        3. 解决事务不一致的问题,配置事务
          1. 配置事务管理器
          2. 配置事务增强
          3. 配置切面
        4. 使用注解解决事务问题

      参考:

    声明:本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给出原文连接。 
  • 相关阅读:
    websocket介绍
    阿里支付接口
    王爽 汇编 检测点 14.2
    如何用汇编写出一个心形图像
    王爽 汇编 实验12
    王爽 汇编 实验11
    王爽 汇编 实验10
    王爽汇编 检测点10.5
    二元选择排序
    螺旋矩阵
  • 原文地址:https://www.cnblogs.com/hellovoyager1/p/9316633.html
Copyright © 2020-2023  润新知