Spring

什么是spring? 

对于java企业级应用的开源开发框架,简化Java开发的,以简单的Java对象为基础的编程模型促进良好的编程习惯。

好处:轻量(基本的版本大约2M)

Spring 是一个开源框架,主要优势是其分层架构,分层架构允许选择使用哪一个组件。

七大模块组成包含Spring Core,AOP,ORM,DAO,Web,Context,Web MVC。 Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 对象的方式。组件都可以单独存在,或者与其他一个或多个模块联合实现。 

Spring Core
Core模块是Spring的核心类库,Spring的所有功能都依赖于该类库,Core主要实现IOC(控制反转)功能,Spring的所有功能都是借助IOC实现的。

AOP
AOP模块是Spring的AOP库,提供了AOP(拦截器)机制,并提供常用的拦截器,供用户自定义和配置。 AOP是OOP的延续

主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等  

ORM
Spring 的ORM模块提供对常用的ORM框架的管理和辅助支持

DAO
Spring 提供对JDBC的支持,对JDBC进行封装,

WEB
WEB模块提供对常见框架如Struts1,WEBWORK(Struts 2),JSF的支持,Spring能够管理这些框架

Context
Context模块提供框架式的Bean访问方式,其他程序可以通过Context访问Spring的Bean资源,相当于资源注入。

Web MVC
WEB MVC模块为Spring提供了一套轻量级的MVC实现,在Spring的开发中,我们既可以用Struts也可以用Spring自己的MVC框架,相对于Struts,Spring自己的MVC框架更加简洁和方便。

 

 

spring 的优点:

1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦
2.可以使用容易提供的众多服务,如事务管理,消息服务等
3.容器提供单例模式支持
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
5.容器提供了众多的辅助类,能加快应用的开发
6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring属于低侵入式设计,代码的污染极低
8.独立于各种应用服务器
9.spring的DI机制降低了业务对象替换的复杂性
10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部

 

spring ioc指的是控制反转,它是一种思想,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。交由Spring容器统一进行管理,从而实现松耦合

传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,由Ioc容器来控制对象的创建,
传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;
由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控,即在一个类中调用另外一个类。(控制的什么被反转了?就是:获得依赖对象的方式反转了)

控制权由应用代码中转到了外部容器,控制权的转移,即所谓反转。

Spring框架的两个最基本和最重要的包是org.springframework.beans.factory(该包中的主要接口是BeanFactory)和org.springframework.context包(该包中的主要接口是ApplicationFactory)。这两个包中的代码提供了Spring IoC特性的基础。

applicationContext.xml配置文件包含Bean的id、类、属性及其值;包含一个<beans>元素和数个<bean>子元素。

Spring IoC框架可根据Bean的id从Bean配置文件中取得该Bean的类,并生成该类的一个对象,继而从配置文件中获得该对象的属性和值。

 

IoC容器负责容纳bean,并对bean进行管理。在Spring中,BeanFactory是IoC容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。Spring为我们提供了许多易用的BeanFactory实现,XmlBeanFactory就是最常用的一个。该实现将以XML方式描述组成应用的对象以及对象间的依赖关系。XmlBeanFactory类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用。

什么是DI / IOC

IOC控制反转主要强调的是程序之间的关系是由容器(spring)控制的,容器控制对象,控制了对外部资源的获取。而反转即为,在传统的编程中都是由我们创建对象获取依赖对象,而在IOC中是容器帮我们创建对象并注入依赖对象,正是容器帮我们查找和注入对象,对象是被获取,所以叫反转。

可以理解为当一个对象a调用另一个对象b的时候,传统的写法是在对象a中把对象b实例化,但是在spring中,a和b对象都是spring初始化并管理的,通过set方法注入或者构造方法注入给b对象的引用。

1.控制反转 (IOC)(或者叫做依赖注入(DI ))
2.Spring 面向切面编程(AOP)
简单理解:功能对象不是自己实例化,通过注入实现(优点:解决硬编码问题)

 

 

什么是AOP

      主要是管理系统层的业务,比如日志,权限,事物等。AOP是将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为切面(aspect),切面将那些与业务逻辑无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

 

 

1.面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
2.在不影响原来功能代码的基础上,使用动态代理加入自己需要的一些功能(比如权限的验证,事务的控制,日志的记录等等),移除之后,并不影响原来的功能
3.面向切面编程是通过动态代理实现的,是对面向对象思想的补充。
4.可以提供声明式的事务管理。
5.spring支持用户自定义的切面。

aop的advice有哪些

1)before:在执行切入的方法之前,执行代码

2)after returning:在执行切入的方法正常执行(没有异常)之后,执行代码

3)after throwing:在执行切入的方法发生异常的时候,执行代码

4)after:在执行切入的方法无论是否发生异常,都必须最后执行代码

 

aop框架具有的两个特征:
1.各个步骤之间的良好隔离性
2.源代码无关性

IOC实现原理

使用反射机制+XML技术

 

 

 当web容器启动的时候,spring的全局bean的管理器会去xml配置文件中扫描的包下面获取到所有的类,并根据你使用的注解,进行对应的封装,封装到全局的bean容器中进行管理,一旦容器初始化完毕,beanID以及bean实例化的类对象信息就全部存在了,现在我们需要在某个service里面调用另一个bean的某个方法的时候,我们只需要依赖注入进来另一个bean的Id即可,调用的时候,spring会去初始化完成的bean容器中获取即可,如果存在就把依赖的bean的类的实例化对象返回给你,你就可以调用依赖的bean的相关方法或属性等;

将Spring配置到应用开发中有以下三种方式:

  1. 基于XML的配置
  2. 基于注解的配置
  3. 基于Java的配置

    Spring 加载配置文件是将我们配置的信息保存在一个HashMap中,HashMap的key就是Bean 的 Id ,HasMap 的value是这个Bean,只有这样才能通过context.getBean("animal")这个方法获得Animal这个类。Spirng可以注入基本类型,而且可以注入像List,Map这样的类型。依赖注入的思想也很简单,它是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。


    IoC的别名:依赖注入(DI),是IOC的一个方面。IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后IOC容器负责把他们组装起来。依赖注入(DI)和控制反转(IoC)是从不同的角度描述的同一件事情,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象之间的解耦。
    那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

    构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。

    Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。

    @Service来标记这个类是bean管理的类,而@Autowired或者@Resource用于bean之间相互依赖使用

解释Spring框架中bean的生命周期

① Spring IoC容器找到关于Bean的定义并实例化该Bean。 
② Spring IoC容器对Bean进行依赖注入。 
③ 如果Bean实现了BeanNameAware接口,则将该Bean的id传给setBeanName方法。 
④ 如果Bean实现了BeanFactoryAware接口,则将BeanFactory对象传给setBeanFactory方法。 
⑤ 如果Bean实现了BeanPostProcessor接口,则调用其postProcessBeforeInitialization方法。 
⑥ 如果Bean实现了InitializingBean接口,则调用其afterPropertySet方法。 
⑦ 如果有和Bean关联的BeanPostProcessors对象,则这些对象的postProcessAfterInitialization方法被调用。 
⑧ 当一个bean不再被调用时将从bean容器中移除。
⑨ 当销毁Bean实例时,如果Bean实现了DisposableBean接口,则调用其destroy方法。

spring Bean的生命周期简单易懂,首先初始化bean实例,其次spring ioc容器对bean进行依赖注入,然后实现一系列spring bean的接口,最后当一个bean不再被调用时将从bean容器中移除,如果bean实现了DisposableBean接口,则调用其destory方法。

 

  1、实例化一个Bean--也就是我们常说的new;

    2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;

    3、如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值

    4、如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);

  5、如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);

    6、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;

    7、如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。

    8、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;

    注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。

    9、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;

    10、最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

 

spring常见的注入方式有哪些?
构造注入,setter注入,基于注解的注入

spring的事务?
声明式事务:将业务代码和事务管理分离,使用注解和xml配置来管理事务
编程式事务:通过编程的方式管理事务,灵活性高,但难维护,需要调用beginTransaction(),commit(),rollback()等事务管理的相关方法

spring的事务隔离
脏读:一个事务读到另一个事务未提交的更新数据

幻读:第一个事务对一个表的数据进行修改,比如涉及修改表中的全部数据,同时第二个事务修改了这个表的数据,比如插入一行新数据,就会发生操作第一个事务的用户发现表中还有数据没有修改

不可重复读:在同一个事务中先后执行两条一模一样的select语句,期间没有执行任何的DDL语句,但得到的结果不一样

spring的设计模式
工厂模式:创建对象时不对客户端暴露创建逻辑,通过使用一个共同的接口来指向新创建的对象,如BeanFactory
代理模式:两种代理模式,一种若对象实现了接口,spring使用jdk的类代理,若没有实现接口,spring使用cglib生成目标对象的子类
单例模式:bean默认都是单例模式
模板方法模式:解决代码重复问题
前端控制器模式:spring提供了DispatcherServlet来对请求进行分发
视图帮助:spring的jsp标签来辅助将分散的代码整合到视图中
依赖注入:贯穿于beanfactory/Application Context接口的核心理念
原型模式:每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例

spring支持几种bean的作用域
singleton(单例模式)、prototype(原型模式)、request(HTTP请求)、session(会话)、global-session(全局会话)

spring中bean的装配方式

springMVC
SpringMvc的执行流程
1. 用户发送请求至前端控制器DispatcherServlet
2. DispatcherServlet收到请求调用HandlerMapping处理器映射器
3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
4. DispatcherServlet调用HandlerAdapter处理器适配器
5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
6. Controller执行完成 返回ModelAndView
7. HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
11. DispatcherServlet响应用户

SpringMvc的核心组件
DispatcherServlet:是整个springmvc的入口程序,也就是说HTML发送请求到达后端java代码的时候首先会被整个DispatcherServlet所拦截

HandlerMapping:分发请求器 在被DispatcherServlet拦截之后,具体要寻找某一个@RequestMapping,那么这个时候HandlerMapping就派上用场了

posted @ 2020-04-15 22:56  11月肖邦  阅读(263)  评论(0)    收藏  举报