Spring 核心知识点

2022-07-14  本文已影响0人  指下光年

Spring 核心知识点

一、spring概述

1、Spring 简介

Spring是一个分层的全栈轻量级开源框架,核心是IOCAOP,还可以整合众多的第三方开源框架和类库,已经成为使用最多的 JAVA EE企业级应用开源框架

2、Spring的优势

3、Spring的核心结构

Spring 是一个层级清晰,职责分明、且依赖关系非常轻量的框架,主要包括几个模块:

如图:


image.png

二、Spring核心

IOCAOPSpring的核心

1、IOC

1.1、IOC的定义

IOC,控制反转,它是一个技术思想,核心就是将new对象的操作交由IOC容器去帮助我们完成,包括创建实例化对象并管理它,我们需要使用哪个对象,去IOC容器获取即可。控制指的是对象创建(实例化、管理)的权力,反转指的是控制权交给了外部环境(IOC容器)

1.2、IOC解决了什么问题

1.3、IOC和DI的区别

IOC和DI描述的是同一件事情(对象实例化以及依赖关系维护这件事),只是不同角度罢了。IOC是站在对象的角度,对象实例化及其管理的权力交给了容器,DI是站在容器的角度,容器会把对象依赖的属性注入。

2、AOP

2.1、AOP定义

面向切面编程,是OOP(面向对象)的延续,OOP解决不了以下问题:

AOP提出横向抽取机制,将横切逻辑代码和业务逻辑代码分离

2.2、AOP解决了什么问题

在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。

2.3、为什么叫做面向切面编程

切:指的是横切逻辑,原有业务逻辑代码我们不能动,只能操作横切逻辑代码,所以⾯向横切逻辑
⾯:横切逻辑代码往往要影响的是很多个⽅法,每⼀个⽅法都如同⼀个点,多个点构成⾯,有⼀个 ⾯的概念在⾥⾯

三、Spring IOC应用

1、Spring IOC基础

2、Spring IOC的三种实现方式

3、BeanFactory和ApplicationContext的区别

BeanFactory是Spring框架IOC容器的顶层接口,用于定义一些基础功能和规范,ApplicationContext是它的一个子接口。通常我们称BeanFactory是Spring IOC的基础容器,ApplicationContext是容器的高级接口,比BeanFactory拥有更多功能,比如说国际化支持和资源访问(XML、JAVA配置类等)。

4、实例化Bean的三种方式

在默认情况下,通过反射调用无参构造函数来创建对象,如果类中没有无参构造函数,则创建对象失败。

<bean id="ConnUtils" class="com.lagou.edu.utils.ConnUtils"> </bean>
<bean id="userService" class="com.lagou.factory.BeanFactory" factory-method="getTransferService"></bean>
<bean id="beanFactory"
class="com.lagou.factory.instancemethod.BeanFactory"></bean>
<bean id="transferService" factory-bean="beanFactory"factorymethod="getTransferService"></bean>

5、Bean的作用范围及生命周期

作用范围:

<bean id="transferService" class="com.lagou.service.impl.TransferServiceImpl" scope="singleton">
</bean>

不同作用范围有不同的生命周期:

6、bean标签的常用属性

7、常用注解

Spring IOC高级特性

1、lazy-init延迟加载

延迟加载指的是Spring Bean的延迟创建。默认情况下,Spring会在容器启动时就将所有的singleton bean提前进行实例化,例如:

<bean id="ConnUtils" class="com.lagou.edu.utils.ConnUtils" lazy-init="false">
    </bean>

lazy-init为false表示在spring启动时,立即进行实例化该bean

如果不想让某个singleton beanApplicationContext初始化时被提前实例化,可以将bean设置为延迟加载,即将lazy-init属性设为true即可,此时的bean只有当第一次向容器getBean的时候才会进行实例化。

如果一个设置了立即加载的bean1,引用了一个延迟加载的bean2,那么bean1在容器启动时被实例化,而bean2由于被bean1引用,也在此时被实例化,符合延迟加载的bean在第一次被使用时才初始化的原则。

如果一个bean的scope属性为scope="prototype"时,即使设置了lazy-init=false,容器启动时也不会实例化bean,而是调用getBean方法才会进行初始化。

延迟加载应用场景:

容器不是一个Map,map其实只是ioc容器的一个成员,叫单例池,容器是一组组件和过程的集合,包括BeanFactory单例池BeanPost

四、Spring AOP应用

AOP本质:在不改变原有业务逻辑的情况下增强横切逻辑,常用于权限校验、日志记录、事务控制、性能监控等。

1、Spring AOP术语

切面=切入点(锁定方法)+方位点(锁定方法中的特殊时机)+横切逻辑

2、Spring中AOP的代理选择

Spring AOP思想是通过动态代理技术来实现的。

在默认情况下,Spring会根据被代理对象是否实现接口来选择JDK还是CGLIB代理,如果被代理类未实现接口,则采用CGLIB代理,如果实现了接口,则采用JDK动态代理,我们也可以通过配置来让Spring强制使用CGLIB代理。

3、Spring中AOP的配置方式

SpringAOP也有三种配置方式:

4、Spring中AOP实现

XML模式
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>5.1.12.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.4</version>
</dependency>
<!--把通知bean交给spring来管理-->
<bean id="logUtil" class="com.lagou.utils.LogUtil"></bean>
<!--开始aop的配置-->
<aop:config>
<!--配置切⾯-->
 <aop:aspect id="logAdvice" ref="logUtil">
 <!--配置前置通知-->
 <aop:before method="printLog" pointcut="execution(public *
com.lagou.service.impl.TransferServiceImpl.updateAccountByCardNo(com.lagou
.pojo.Account))"></aop:before>
 </aop:aspect>
</aop:config>
  1. 访问修饰符 返回值 包名.包名.包名.类名.方法名(参数列表)

  2. 其中访问修饰符可以省略

  3. 返回值可以使用* 表示任意返回值

  4. 包名可以使用.表示任意包,但是有几级包就对应几个 , 因此可以使用..来表示当前包及其子包类和方法名都可以使用.表示任意类、任意方法

  5. 参数列表,基本类型直接写类型名称,如int,引用类型必须写全限定类名,如java.lang.String
    参数列表可以使用..表示有无参数均可

    全通配方式:* *..*.*(..)

<aop:config proxy-target-class="true">

<!--此标签是基于XML和注解组合配置AOP时的必备标签,表示Spring开启注解配置AOP的⽀持-->
      <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectjautoproy>
<!--
       作⽤:
       ⽤于配置前置通知。
       出现位置:
       它只能出现在aop:aspect标签内部
       属性:
       method:⽤于指定前置通知的⽅法名称
       pointcut:⽤于指定切⼊点表达式
       pointcut-ref:⽤于指定切⼊点表达式的引⽤
      -->
      <aop:before method="printLog" pointcut-ref="pointcut1">
      </aop:before>
- 正常执行的通知:after-returning标签
<!--
       作⽤:
       ⽤于配置正常执⾏时通知
       出现位置:
       它只能出现在aop:aspect标签内部
       属性:
       method:⽤于指定后置通知的⽅法名称
       pointcut:⽤于指定切⼊点表达式
       pointcut-ref:⽤于指定切⼊点表达式的引⽤
       -->
       <aop:after-returning method="afterReturningPrintLog" pointcutref="pt1"></aop:after-returning>
- 异常通知:after-throwing标签
<!--
       作⽤:
       ⽤于配置异常通知。
       出现位置:
       它只能出现在aop:aspect标签内部
       属性:
       method:⽤于指定异常通知的⽅法名称
       pointcut:⽤于指定切⼊点表达式
       pointcut-ref:⽤于指定切⼊点表达式的引⽤

       -->
       <aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1"
      ></aop:after-throwing>
- 最终通知:after标签
<!--
       作⽤:
       ⽤于指定最终通知。
       出现位置:
       它只能出现在aop:aspect标签内部
       属性:
       method:⽤于指定最终通知的⽅法名称
       pointcut:⽤于指定切⼊点表达式
       pointcut-ref:⽤于指定切⼊点表达式的引⽤
      -->
      <aop:after method="afterPrintLog" pointcut-ref="pt1"></aop:after>
无论切入点方法是否产生异常,都会在返回之前执行

- 环绕通知:around标签
<!--
       作⽤:
       ⽤于配置环绕通知。
       出现位置:
       它只能出现在aop:aspect标签的内部
       属性:
       method:⽤于指定环绕通知的⽅法名称
       pointcut:⽤于指定切⼊点表达式
       pointcut-ref:⽤于指定切⼊点表达式的引⽤

       -->
      <aop:around method="aroundPrintLog" pointcut-ref="pt1"></aop:around>
环绕通知有别于其他通知,一般不与其他通知一起配置使用,它是Spring框架为我们提供的一种可以通过编码方式,控制增强代码何时执行的通知类型。
XML+注解模式
<!--开启spring对注解aop的⽀持-->
    <aop:aspectj-autoproxy/>
注解模式

配置类加入如下注解:

@Configuration
  @ComponentScan("com.lagou")
  @EnableAspectJAutoProxy //开启spring对注解AOP的⽀持
  public class SpringConfiguration {
  }

5、Spring声明式事务支持

1、事务基础

1.1 事务概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败,从而确保数据的准确与安全

1.2 事务的四大特性
1.3 事务的隔离级别

如果不考虑隔离级别,会出现以下情况:

数据库的隔离级别:

效率与级别高低成反比
MYSQL默认的隔离级别是:REPEATABLE READ
查询当前使⽤的隔离级别: select @@tx_isolation;
设置MySQL事务的隔离级别: set session transaction isolation level xxx;
(设置的是当前 mysql连接会话的,并不是永久改变的)

1.4 事务的传播行为

事务往往在service层进行控制,如果出现service层方法A调用了另一个service层方法B,A和B方法本身都已经添加了事务控制,那么A在调用B的时候,就需要进行一些事务策略的协商,这就叫做事务的传播行为。

2、Spring声明式事务配置

2.1 纯XML模式
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</artifactId>
     <version>5.1.12.RELEASE</version>
    </dependency>
    <dependency>
     <groupId>org.aspectj</groupId>
     <artifactId>aspectjweaver</artifactId>
     <version>1.9.4</version>
    </dependency>
    <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-jdbc</artifactId>
     <version>5.1.12.RELEASE</version>
     </dependency>
    <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-tx</artifactId>
     <version>5.1.12.RELEASE</version>
</dependency>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
     <!--定制事务细节,传播⾏为、隔离级别等-->
     <tx:attributes>
     <!--⼀般性配置-->
     <tx:method name="*" read-only="false"
    propagation="REQUIRED" isolation="DEFAULT" timeout="-1"/>
     <!--针对查询的覆盖性配置-->
     <tx:method name="query*" read-only="true"
    propagation="SUPPORTS"/>
     </tx:attributes>
     </tx:advice>
     <aop:config>
     <!--advice-ref指向增强=横切逻辑+⽅位-->
     <aop:advisor advice-ref="txAdvice" pointcut="execution(*
    com.lagou.edu.service.impl.TransferServiceImpl.*(..))"/>
     </aop:config>
2.2 XML+注解
<!--配置事务管理器-->
    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManage
    r">
     <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--开启spring对注解事务的⽀持-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
@Transactional(readOnly = true,propagation = Propagation.SUPPORTS)
2.3 纯注解

Spring基于注解驱动开发的事务控制配置,只需要把 xml 配置部分改为注解实现。只是需要⼀个 注解替换掉xml配置⽂件中的 配置。 在 Spring 的配置类上添加 @EnableTransactionManagement 注解即可。配置如下:

@EnableTransactionManagement//开启spring注解事务的⽀持
public class SpringConfiguration {
}
上一篇 下一篇

猜你喜欢

热点阅读