对Spring的理解

Posted 礼炮1号空间站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对Spring的理解相关的知识,希望对你有一定的参考价值。

1.是一个轻量级的框架,这个轻量级就体现在非侵入式上,即在代码实现过程中不需要继承Spring框架的相应类或实现相应接口。

2.Spring的核心就是IOC(控制反转) 和AOP,在Spring中,无需再在代码里进行以new的方式来使用了,所有的Bean对象都交由IOC容器进行管理(Bean实例对象的创建、属性值的设置、初始化、销毁整个生命周期都由IOC容器来管理),所以,第一个需要明白的就是所有的对象放在了一个统一的地方由Spring帮我们管理着。并且,各个对象中所需要的其他依赖(就是一个对象中引用的其他对象,成员变量等)是通过依赖注入(DI)的方式进行传递,也就是说无需我们调用setter方法进行设置。使用时直接从IOC容器中获取这些对象进行使用即可。对象和对象之间的调用不会再以 new 这种硬编码的方式进行关联了,做到了解耦。

3.Spring中IOC容器有两种实现方式,一种是BeanFactory接口定义,一种是ApplicationContext接口定义(继承于BeanFactory实现)。我们主要以ApplicationContext为主。

这里初始化IOC容器实际上就是创建ApplicationContent上下文对象的过程。即ApplicationContent就表示的是IOC容器。这里创建ApplicationContext时需要根据配置文件进行初始化IOC

容器,配置文件里就是告诉了Spring需要将哪些指定的Bean放到IOC容器中管理起来。配置的方式有多种,从类路径下加载一个或多个xml文件、从一个或多个基于java的配置类中加载、从文件系统下的一个或多个xml文件中加载。基本都类似,这里我们看下从类路径中加载。

ApplicationContext ctx=new ClassPathXmlApplicationContext("application.xml"),其中ClassPathXmlApplicationContext类为ApplicationContext接口的实现类,当然加载方式不同,它还有其他的实现类。执行完这句后,即已经将在application.xml中指定的Bean在ctx 这个IOC容器中进行了创建,完成依赖注入,等待使用。这里,我们单独使用Spring时通过这种方式来自行创建IOC容器。和SpringMVC集成后,IOC容器的创建初始化是由 web 容器来完成的。

4.xml 文件中指定一个Bean:

  <Bean id="test" class="com.test.testSpring">

    <Property name="name" value="test"></Property>

  </Bean>

这里是通过反射(即通过类名来完成对象的创建)的方式让Spring完成testSpring对象的创建的,这里的class属性就是类的全限定名。

5.依赖注入的两种方式:

  a. 属性注入:以Property标签定义  

  <Bean id="test" class="com.test.testSpring">

    <Property name="name" value="test"></Property>

  </Bean>  

  b.构造方法注入:以constructor-arg标签定义 

  <Bean id="test" class="com.test.testSpring">

    <constructor-arg  value="test"></Property>

  </Bean>

一般情况下,给一个对象传入所依赖的属性值时一般就是以上两种方法,所以,依赖注入时主要也是以上两种方法,这里由于注入的值类型有很多种,有可能是一个String,有可能是List,也有可能是一个引用类型的,所以根据不同的类型对应有不同的表示方法。XML中Bean的这种装配方式以经是比较古老的方法了,这里只是便于理解Spring的内部机制,实际使用时都是通过注解的方式进行使用。

6.IOC容器中管理的Bean的生命周期:

1).通过类的构造器或工程方法创建Bean实例

2).为Bean的属性设置值以及对其他Bean的引用

3).调用Bean的初始化方法

4).Bean已准备好,可以使用了,等待使用

5).当容器关闭时,调用Bean的销毁方法

7.Spring的一大功能就是管理Bean,所以,Spring框架整合其他时其实就是把其他具有不同功能的Bean纳入Spring容器管理起来。所以我们在整合Mybatis等时,看到的是配置了一些相应功能的<Bean>

8.Spring AOP:

面向切面编程(Aspect Oriented Programming),主要的编程对象是切面(aspect),即是将各横切关注点模块化(将共同的方法进行抽象,使得可重复使用)为切面的过程。

AOP能使业务模块更简洁,只包含核心业务代码。使得诸如日志等非核心业务代码从核心业务代码中分离出去,集中于一个位置,而不是分散到多处代码中,便于维护和升级。

上图中,add,sub,mul,div这些方法为核心的业务逻辑,现在需要对每个方法进行一些参数验证和在执行前后进行日志打印,之前的做法是在每个方法中加上相应的代码。如此一来,非核心业务和核心业务的代码就混在了一起,并且如果要改动验证或日志相关的东西,每个方法中的可能都需要改一遍,不利于代码的维护。所以,如果能将这些有共同特性的散布于各处的非核心代码进行抽象成一个公用模块,在需要使用它的地方把它插进去,那将是一件很美妙的事情,这就是AOP的由来。AOP中的几个主要概念:

横切关注点:散布于应用中的多处非核心业务逻辑的功能,如上图中的日志、验证参数的功能,这些功能往往是嵌入到核心的业务逻辑当中的。将这些横切关注点和核心的业务逻辑分离,正是面向切面编程需要考虑的。

切面:将横切关注点模块化后的类被称为切面,这是一种特殊的类,在类中定义通用功能,并且通过申明的方式定义这个功能在何时应用到何处。

通知:切面所要做的事情,通知定义了切面是什么以及何时使用。通知根据使用时机,可分为:前置通知、后置通知、返回通知、异常通知、环绕通知

连接点:在应用执行过程中能够插入切面的一个点,这个点理论上会有很多个,这个点可以是调用方法时,抛出异常时,甚至修改一个字段时。通过这些点,切面代码可以插入到应用的正常流程当中以添加新的行为。

切点:确定了要将切面插入到哪个具体的连接点。通过切点表达式可以将切面中的通知匹配到一个或多个连接点。例如,有多个方法,切点决定可以将切面织入那几个方法(是方法的前面?后面?还是正常执行结束后?或发生异常后?这由定义的通知类型来决定)。

目标对象:需要给织入切面的对象(正常的定义业务逻辑的类)。

Spring的切面由包裹了目标对象的代理类实现,代理类处理方法的调用,执行额外的切面逻辑,并调用目标方法,Spring在运行时才创建代理对象,也就是说应用中需要被代理的Bean时,Spring才创建代理对象。

 

以上是关于对Spring的理解的主要内容,如果未能解决你的问题,请参考以下文章

谈谈对Spring IOC的理解

Spring 容器相关理解

谈谈对Spring IOC的理解

简述你对Spring框架IOC和AOP的理解。

对Spring的深入理解

Spring框架AOP的使用及个人对底层原理的理解