栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring总结

1.什么是Spring

Spring是一个轻量级的开源的JavaEE框架;致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。

特点:

  1. 方便解耦(IOC),简化开发。
  2. 支持Aop编程。
  3. 方便程序测试。
  4. 方便与其他框架进行整合。
  5. 方便进行实务操作。
  6. 降低API开发难度。
2.Spring基本框架

  1. Spring Core:这是Spring框架最基础的部分,它提供了依赖注入(DependencyInjection)特征来实现容器对Bean的管理。这里最基本的概念是BeanFactory,它是任何Spring应用的核心。BeanFactory是工厂模式的一个实现,它使用IOC将应用配置和依赖说明从实际的应用代码中分离出来。
  2. Spring AOP:Spring在它的AOP模块中提供了对面向切面编程的丰富支持。这个模块是在Spring应用中实现切面编程的基础。
  3. Spring ORM:负责框架中对象关系映射,提供相关ORM 接入框架的关系对象管理工具 。Spring提供了ORM模块。Spring并不试图实现它自己的ORM解决方案,而是为几种流行的ORM框架提供了集成方案(整合MyBatis)
  4. Spring DAO:使用JDBC经常导致大量的重复代码,取得连接、创建语句、处理结果集,然后关闭连接。Spring的JDBC和DAO模块抽取了这些重复代码,因此你可以保持你的数据库访问代码干净简洁,并且可以防止因关闭数据库资源失败而引起的问题。另外,这个模块还使用了Spring的AOP模块为Spring应用中的对象提供了事务管理服务。
  5. Spring Context:Spring 上下文是一个配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企业服务,例如电子邮件、国际化、校验和调度功能。
  6. Spring Web:Web上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文(web.xml)。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  7. Spring Web MVC :底层基于Servlet API。
3.Spring IOC 3.1什么是IOC

控制反转、帮我们维护对象与对象之间的依赖关系,降低对象之间的耦合度。

例如: 有 a 和 b 两个对象,在注入 IOC 之前,a 依赖于 b 那么对象 a 在初始化或者运行到某一点的时候,自己必须主动去创建对象 b 或者使用已经创建的对象 b ,无论是创建还是使用对象 b ,控制权都在自己手上 ,而注入 IOC 之后就变了,对象 a 与对象 b 之间失去了直接联系,当对象 a 运行到需要对象 b 的时候,IOC 容器会主动创建一个对象 b 注入到对象 a 需要的地方。其实通过上边这个举例可以很明显的就看出来,对象 a 获得依赖对象 b 的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

3.2IOC原理

xml解析、工厂模式、反射

3.3IOC容器

3.4IOC中的Bean对象

Spring中有两种Bean

  1.  普通 bean:在配置文件中定义 bean 类型就是返回类型。
  2. 工厂bean:在配置文件定义 bean 类型可以和返回类型不一样。(bean对象需要实现FactoryBean接口,重写里面的方法)  

Bean的生命周期

  1. 通过构造器创建Bean。
  2. 为Bean属性赋值,set/DI注入。
  3. 调用Bean的初始化方法。(在一个方法上加@PostConstruct注解:对象创建完会调用此方法)
  4. Bean可以使用。
  5. 容器关闭时,调用bean的销毁方法。(在一个方法上加@PreDestroy注解:对象销毁前会调用此方法)

Bean的作用域:单例、多例

  

3.5IOC操作Bean管理

Bean管理:

  1. Spring创建对象:反射调用无参构造(默认)、有参构造。
  2.  Spring注入属性---DI 依赖注入
    1.  set注入:声明对应的属性类型和名称,创建与其对应的set方法。属性可以在对象创建完后在注入。
    2. 构造注入:在构造方法中声明要被注入的属性(包括被依赖对象);当对象创建完,属性也注入好了。
    3. 接口注入:要注入依赖对象必须实现某一个接口,接口提供一方法,用来为其注入依赖对象(死板且繁琐---已淘汰)。

Bean管理的方式:

  1. 基于xml
    1.  基于xml创建对象 ​ 
    2. 基于xml使用set注入属性 ​ 
    3. 基于xml使用有参构造注入属性 ​ 
  2. 基于注解 
    1.   基于注解创建对象     

    2. 基于注解注入属性    


常用注解

@componentScan:指明容器要扫描哪些包。

@Componen、@Controller、@Service、@Repository:声明Bean。

@Autowired(只能按类型注入)、@Resource(可按类型或名称注入):注入Bean。

@Scop:声明Bean的作用域,默认是单例。


4.Spring AOP

面向切面编程:利用AOP对业务逻辑进行逻辑的各部分进行隔离,从而使得业务逻辑各部分耦合度降低,提高程序的可重用性。

不能对final修饰的类进行代理;只能对IOC中的Bean进行增强。

例如:

  

原理 :

  1. JDK动态代理
  2. CGLIB动态代理(见反射)

AOP术语:

  1. 连接点:类里面可以被增强的方法。
  2. 切入点:当前实际上真正被增强的方法。
  3. 通知:实际增强的逻辑部分
    1.  
    2.  前置通知:@before
    3. 后置通知:@after
    4. 环绕通知:@around
    5. 异常通知:@afterThrowing
    6. 最终通知:@afterReturning
  4. 切面:把通知应用到切入点的过程。  

5.Spring事务管理

逻辑上一组操作,要么都执行,要么都不执行。

spring 如何管理事务:

  1. 编程式事务:手动开启、提交、回滚事务。
  2. 声明式事务:通过AOP方式在方法前使用编程式事务的方法开启事务,在方法后提交或回滚事务,用配置文件方法或注解方式管理事务。
    1.  基于注解管理事务:         
    2. 基于配置xml管理事务:
       
          
          
          
              
              
              
              
              
              
              
          
          
          
              
          
          
        
      -
      
      
      
      
      
      -
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      -
      
      
      
      
      
      
      
      
      
      
      
      
      
      

 事务传播方式

多个事务方法之间进行调用的规则,使用@propagation注解来声明事务传播方式。

 


6.Spring循环依赖

循环依赖的三种情况 :

  1. 构造器循环依赖----无法解决
  2. 单例模式下的set循环依赖---三级缓存处理
  3. 非单例模式下set循环依赖---无法解决

三级缓存

  1. 三级缓存(SingletonFactories):进入实例化阶段的单例对象工厂的cache。
  2. 二级缓存(earlySingletonObjects):完成实例化但尚未初始化,提前曝光的单例对象cache。
  3. 一级缓存(SingletonObjects):完成初始化的单例对象的cache。

例如:A依赖于B        B依赖于A

A先完成初始化:        第一步----创建实例(此时A会被放到三级缓存中备份)

                                    第二步----填充属性---》getB,发现B没有

                                   creat(B)----》B.get(A)------》一级、二级缓存中没A----》去三级缓存中拿到A

                                   B拿到A,完成属性填充,完成初始化------》B将自己放到一级缓存

                                  再返回A----》A拿到B,完成属性填充,完成初始化---》A将自己放入一级缓存

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/831342.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号