spring知识点总结

概念

轻量级的(面向切面AOP)、(IOC控制反转)容器框架。html

Spring优势

1.下降组件之间的耦合性前端

2.专一于本身业务逻辑,统一的行为(日志、安全等)抽象出来统一处理java

3.易于单元测试程序员

4.方便事物处理spring

5.Spring并不强制应用彻底依赖于Spring,开发者可自由选用Spring框架的部分或所有数据库

6 . spring对于主流的应用框架提供了集成支持,如hibernateJPAStruts 编程

7 . spring属于低侵入式设计,代码的污染极低  后端

8 . 提供了单例模式支持。安全

Spring七个模块

  1. Spring context
  2. Spring AOP
  3. Spring DAO
  4. Spring ORM
  5. Spring Web
  6. Spring MVC
  7. Spring Core

AOPIOC

aop网络

容许程序经过分离的应用业务逻辑与系统级别服务。程序员只需专一本身的业务逻辑,而不须要管系统级服务。容器中的对象享有容器中的公共服务(日志、安全).

原理

经过动态代理作到这一点。用到了代理模式,代理模式是一种静态代理,而动态代理就是利用反射和动态编译将代理模式变成动态的。得知被代理类后经过反射得知他的一切信息,而后动态编译成代理类的class文件(动态组装成代理类,生成java文件,再编译成class文件)。

优势

提供另一种编程思路,能够把相似的行为抽离出来统一处理。

ioc

依赖注入(DI)和控制反转(Inversion of Control)是同一个概念控制权的反转,在程序中对象的控制权转到容器而不是程序员本身控制促进了松耦合。依赖注入,将相互依赖的对象分离,在Spring配置文件中,描述他们的依赖关系,用到一个对象时注入不须要New一个对象。

原理

经过工厂+反射将咱们的bean放到容器中,当咱们想用某个bean的时候,只须要调用getBean("beanID")方法。

优势

解耦、统一管理bean,缺点占用内存多、构造对象慢

beanFactory与ApplicationContext

两者是父子关系

SpringIoC容器就是一个实现了BeanFactory接口的可实例化类它就是 Spring IoC 容器的真面目。ioc使用 BeanFactory 来实例化、配置和管理 Bean

若是说BeanFactorySpring的心脏,那么ApplicationContext就是完整的躯体了,ApplicationContextBeanFactory派生而来,提供了更多面向实际应用的功能。

(1)MessageSource, 提供国际化的消息访问  
2)资源访问,如URL和文件  
3)事件传播特性,即支持aop特性

1.ApplicationContext接口继承BeanFactory接口,Spring核心工厂是BeanFactory ,BeanFactory采起延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean

2.ApplicationContext是对BeanFactory扩展,他能够国际化处理、资源访问、事件传播。

Bean的生命周期

创建

1 . Bean的创建

BeanFactory读取Bean定义文件,并生成各个实例。

初始化

2 . 依赖注入

3.setBeanName()

4.setBeanFactory()

5.processBeforeInitialization()

初始化以前都会执行这个实例的processBeforeInitialization()方法。

6.afterPropertiesSet()

7.init-method

8.processAfterInitialization()

业务逻辑

9.使用Bean一些业务逻辑

销毁

10.destroy()

11.destroy-method

Bean的做用域

1) Singleton: 这是默认的做用域,这种范围确保无论接受多少个请求,每一个容器中只有一个bean的实例,单例模式有BeanFactory自身维护;
2) Prototype: 原形范围与单例范围相反,为每个bean请求提供一个实例;
3) Request: 在请求bean范围内会为每个来自客户端的网络请求建立一个实例,在请求完成之后,bean会失效并被垃圾回收器回收;
4) Session: 与请求范围相似,确保每一个session中有一个bean的实例,在session过时后,bean会随之失效;

Servlet生命周期

  1. 初始化阶段  调用init()方法
  2. 响应客户请求阶段  调用service()方法
  3. 终止阶段  调用destroy()方法

注入和构造注入及其区别

设值注入:类中定义setter()方法,在配置文件中注入参数

<bean id="user" class="com.zcl.spring.setterinjection.User">  

<property name="name" value="Zhao" />  

<property name="age" value="22" />  

property name="country" value="China" />  

</bean>

构造注入:类中声明一个构造方法,并在此方法的参数中定义要注入的对象。

<bean id="user" class="com.zcl.spring.setterinjection.User">  

<constructor-arg value="Zhao" />  

<constructor-arg value="22" />  

<constructor-arg value="China" />  

</bean>  

设值注入优势

1、与传统的JavaBean的写法更类似,程序开发人员更容易理解、接受依赖关系显得更加直观、天然。

2、对于复杂的依赖关系,若是采用构造注入,会致使构造器过于臃肿,难以阅读。而设值注入不会

3、在某些属性可选的状况下,多参数的构造器更加笨重。

构造注入优势

1、构造注入能够在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。

2、对于依赖关系无须变化的Bean,构造注入更有用处。

建议:采用设注入为主,构造注入为辅的注入策略。对于依赖关系无需变化的注入,尽可能采用构造注入;而其它的依赖关系的注入,则考虑设值注入。

Spring实例化bean的三种方法

1.经过构造函数

<bean id="exampleBean" class="examples.ExampleBean"/>

2.经过静态工厂方法

<bean id="exampleBean" class="examples.ExampleBean" 

factory-method="静态方法"/>

3.经过实例工厂方法

<bean id="serviceLocator"  class="examples.DefaultServiceLocator">

  <bean id="clientService" factory-bean="serviceLocator"

     factory-method="createClientServiceInstance"/>

Bean的参数有idclassfactory-beanfactory-method

Spring事物管理简单介绍

包括声明式事务和编程式事务编程式的,比较灵活,可是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活,最大的好处是大大减小了代码量。编程式不经常使用,接下来介绍声明式事务管理。

声明式事务管理创建在AOP之上的,动态代理实现其机制(不改变源码,对原有的功能动态扩展)。声明式事务管理使业务代码不受污染,这正是spring倡导的非侵入式的开发方式。声明式事物处理也有五种不一样的配置方式,单经常使用的是基于 @Transactional注解的声明式事务管理此时在DAO上需加上@Transactional注解,在须要事务处理的类或方法上均可以加。

Spring配置文件中关于事务配置老是由三个组成部分,分别是DataSourceTransactionManager和代理机制这三部分,不管哪一种配置方式,通常变化的只是代理机制这部分。

TransactionDefinition接口定义了四种事物属性是咱们须要知道的

事物传播行为

在开始当前事务以前,一个事务上下文已经存在,此时有若干选项能够指定一个事务性方法的执行行为。

  • TransactionDefinition.PROPAGATION_REQUIRED:若是当前存在事务,则加入该事务;若是当前没有事务,则建立一个新的事务。这是默认值。
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:建立一个新的事务,若是当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_SUPPORTS:若是当前存在事务,则加入该事务;若是当前没有事务,则以非事务的方式继续运行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,若是当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,若是当前存在事务,则抛出异常。
  • TransactionDefinition.PROPAGATION_MANDATORY:若是当前存在事务,则加入该事务;若是当前没有事务,则抛出异常。
  • TransactionDefinition.PROPAGATION_NESTED:若是当前存在事务,则建立一个事务做为当前事务的嵌套事务来运行;若是当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

事物隔离级别

  • TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,一般这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
  • TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务能够读取另外一个事务修改但尚未提交的数据。该级别不能防止脏读,不可重复读和幻读,所以不多使用该隔离级别。好比PostgreSQL实际上并无此级别。
  • TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另外一个事务已经提交的数据。该级别能够防止脏读,这也是大多数状况下的推荐值。
  • TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程当中能够屡次重复执行某个查询,而且每次返回的记录都相同。该级别能够防止脏读和不可重复读。
  • TransactionDefinition.ISOLATION_SERIALIZABLE:全部的事务依次逐个执行,这样事务之间就彻底不可能产生干扰,也就是说,该级别能够防止脏读、不可重复读以及幻读。可是这将严重影响程序的性能。一般状况下也不会用到该级别。

事务超时

  • 所谓事务超时,就是指一个事务所准许实行的最长时辰,假定跨越该时辰限制但事务尚未完成,则自动回滚事务。

事务只读属性

  • 只读事务用于客户代码只读但不修改数据的情形,只读事务用于特定情景下的优化,好比使用Hibernate的时候。

SpringMVC流程

1  用户发送请求至前端控制器DispatcherServlet

2  DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3  处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(若是有则生成)一并返回给DispatcherServlet

4  DispatcherServlet选择合适的HandlerAdapter处理器适配器调用处理器

5  执行处理器(Controller,也叫后端控制器)

6  Controller执行完成返回ModelAndView

7  HandlerAdaptercontroller执行结果ModelAndView返回给DispatcherServlet

8  DispatcherServletModelAndView传给ViewReslover视图解析器

9  ViewReslover解析后返回具体View

10  DispatcherServletView进行渲染视图(即将模型数据填充至视图中)。

11  DispatcherServlet响应用户

相关文章
相关标签/搜索