Spring

  • 1、依赖
  • 1.1 优点
  • 1.2 组成
  • 2 IOC
  • 2.1 spring的IOC容器
  • 2.2 spring中通过@Component、@Repository、@Service、@Controller对spring组件进行注册
  • 2.3 IOC实现类型
  • 3 AOP
  • 3.1 Aop在Spring中的作用
  • 4、配置类方式
  • 1、在配置类中,通过扫描完成spring组件的注册
  • 5 总结
  • 5.1 applicationContext & BeanFactory区别
  • 5.2 事务
  • 5.2.1 事务管理
  • 5.2.2 spring事务传播特性


1、依赖

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.7.RELEASE</version>
 </dependency>

1.1 优点

1、Spring是一个开源免费的框架 , 容器 .
2、Spring是一个轻量级的框架 , 非侵入式的 .
3、控制反转 IoC , 面向切面 Aop
4、对事物的支持 , 对框架的支持
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。

(1)IOC(控制反转)或DI(依赖注入):明确定义组件的接口,独立开发各个组件,然后根据组件的依赖关系组装运行;即将创建及管理对象的权利交给Spring容器。Spring是一个轻型容器,其核心是Bean工厂,用以构造我们所需要的M(Model)。

(2)AOP(面向切面编程):通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。即系统级的服务从代码中解耦出来。例如:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来。

1.2 组成

springdoc与springfox的区别 spring和fall_java


每个模块的功能如下:

核心容器: 核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

Spring 上下文: Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

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。

2 IOC

IOC是指在程序开发中,实例的创建不再由调用者管理,而是由spring容器创建,spring容器会负责控制程序之间的关系,而不是由程序代码直接控制,也因此控制权由程序代码转移到spring容器中,控制权发生反转。

Spring IOC(控制反转)设计思想/DI(依赖注入)实现方式:控制反转模式的基本概念:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件描述哪一个组件需要哪一项服务。容器(在spring框架是IOC容器)负责将这些联系在一起。

2.1 spring的IOC容器

1、BeanFactory
		从容器中取出的组件,为懒加载方式
2、ApplicationContext
		ApplicationContext是BeanFactory的子接口,从容器中取出的组件,为立即加载方式。提供配置类、注解等多种方式,实例化spring容器中管理的组件,并协作对象间的关联关系。

实现类
ClassPathXmlApplicationContext spring使用Xml配置文件注册组件,XML文件必须放在类路径下。
FileSystemXmlApplicationContext spring使用XML配置文件注册组件,可以指定相对路径和绝对路径,查找XML文件。
XmlWebApplicationContext spring使用XML配置文件注册组件,根据WEB应用程序的部署路径查找XML文件。
AnnotationConfigApplicationContext spring使用配置类和注解注册组件。

2.2 spring中通过@Component、@Repository、@Service、@Controller对spring组件进行注册

@Component注册通用的spring容器组件
	@Repository用于注册spring持久组件
	@Service用于注册spring业务组件
	@Controller用于注册spring控制器组件

2.3 IOC实现类型

1、接口注入
利用接口将调用与实现者分离
	public class ClassA { 
   private InterfaceB clzB; 
   public InterfaceB  doSomething() { 
      Ojbect obj = Class.forName(
               Config.BImplementation).newInstance(); 
      clzB = (InterfaceB)obj; 
      return clzB;
    } 
}
2、设置set注入
在类中暴露setter方法来实现依赖关系
	public class Sport {
     private InterfaceBall ball;
     public void setBall(InterfaceBall arg) {
           ball = arg;
     }
}
3、构造器注入
通过构造方法来完成依赖关系
	public class DIByConstructor {
private  DataSource dataSource;
public DIByConstructor(DataSource ds) {
  this.dataSource = ds;
  }
……
}

3 AOP

AOP称为:面向切面编程,是一种通过预编译方式和运行期间,动态代理实现程序功能的统一维护的技术。

3.1 Aop在Spring中的作用

提供声明式事务;允许用户自定义切面

切面(Aspect):就是你要实现的交叉的非核心业务功能。

连接点(Joinpoint):应用程序执行过程中插入切面的地点,可以是方法调用、异常抛出…

通知(Advice):通知切面的实际实现的代码。
通知类型
1、前置通知before:目标方法执行前调用
2、后通知after:目标方法执行后调用(有没有异常都调用)
3、环绕通知around:目标方法执行前后都需要调用
4、抛出异常通知throws:目标方法抛出异常时调用
5、返回后通知@AfterReturning:目标方法正确执行后调用(有异常不执行)

切入点(Pointcut):定义通知应用在哪些连接点。

目标对象(target):被通知的对象

代理(Proxy):将通知应用到目标对象后创建的对象。

织入(Weaving):将切面应用带目标对象从而创建一个新的代理对象的过程。

4、配置类方式

1、在配置类中,通过扫描完成spring组件的注册

申明该类为配置类
@Configuration
// 扫描指定类所在的包,及子包中的spring组件
@ComponentScan(basePackageClasses = ApplicationConfig.class) 
public class ApplicationConfig {
    
}

1、不能像构造器那样注入不可变的对象
2、依赖对外部不可见,外界可以看到构造器和setter,但无法看到私有字段,自然无法了解所需依赖
3、会导致组件与IoC容器紧耦合(这是最重要的原因,离开了IoC容器去使用组件,在注入依赖时就会十分困难)
4、导致单元测试也必须使用IoC容器,原因同上
5、依赖过多时不够明显,比如我需要10个依赖,用构造器注入就会显得庞大,这时候应该考虑一下此组件是不是违反了单一职责原则

5 总结

5.1 applicationContext & BeanFactory区别

BeanFactory接口
(1) spring的原始接口,针对原始接口的实现类功能较为单一
(2)BeanFactory接口实现类的容器,特点是每次在获得对象时才会创建对象

ApplicationContext接口
(1)每次容器启动时就会创建容器中配置的所有对象
(2)提供了更多功能
(3)从类路径下加载配置文件: ClassPathXmlApplicationContext
从硬盘的绝对路径下加载配置文件:FileSystemXmlApplication

5.2 事务

事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用。

事务四个属性ACID

原子性(atomicity)
事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用

一致性(consistency)
一旦所有事务动作完成,事务就要被提交。数据和资源处于一种满足业务规则的一致性状态中

隔离性(isolation)
可能多个事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏

持久性(durability)
事务一旦完成,无论系统发生什么错误,结果都不会受到影响。通常情况下,事务的结果被写到持久化存储器中

5.2.1 事务管理

编程式事务管理
将事务管理代码嵌到业务方法中来控制事务的提交和回滚
缺点:必须在每个事务操作业务逻辑中包含额外的事务管理代码

声明式事务管理
一般情况下比编程式事务好用。
将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。
将事务管理作为横切关注点,通过aop方法模块化。Spring中通过Spring AOP框架支持声明式事务管理。

事务管理器
无论使用Spring的哪种事务管理策略(编程式或者声明式)事务管理器都是必须的。
就是 Spring的核心事务管理抽象,管理封装了一组独立于技术的方法。

5.2.2 spring事务传播特性

事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。spring支持7种事务传播行为:

propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。

propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。

propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。

propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。

propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。

propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

Spring 默认的事务传播行为是 PROPAGATION_REQUIRED,它适合于绝大多数的情况。