Web开发之Spring
90. 为什么要使⽤ spr ing?
Spring是⼀个轻量级的控制反转(IoC)和⾯向切⾯(AOP)的容器框架;
1.轻量  从⼤⼩与开销两⽅⾯⽽⾔Spring都是轻量的。完整的Spring框架可以在⼀个⼤⼩只有1MB多的JAR⽂件⾥发布。并且Spring所需
的处理开销也是微不⾜道的。此外,Spring是⾮侵⼊式的:典型地,Spring应⽤中的对象不依赖于Spring的特定类。
2.控制反转  Spring通过⼀种称作控制反转(IoC)的技术促进了松耦合。当应⽤了IoC,⼀个对象依赖的其它对象会通过被动的⽅式传递进
来,⽽不是这个对象⾃⼰创建或者查依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查依赖,⽽是容器在对象初始化时不等对象请求就主动将依赖传递给它。
3.⾯向切⾯  Spring提供了⾯向切⾯编程的丰富⽀持,允许通过分离应⽤的业务逻辑与系统级服务(例如审计(auditing)和事务
(transaction)管理)进⾏内聚性的开发。应⽤对象只实现它们应该做的——完成业务逻辑——仅此⽽已。它们并不负责(甚⾄是意识)其它的系统级关注点,例如⽇志或事务⽀持。
4.容器  Spring包含并管理应⽤对象的配置和⽣命周期,在这个意义上它是⼀种容器,你可以配置你的每个bean如何被创建——基于⼀个可
配置原型(prototype),你的bean可以创建⼀个单独的实例或者每次需要时都⽣成⼀个新的实例——以及它们是如何相互关联的。然⽽,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞⼤与笨重的,难以使⽤。
5.框架  Spring可以将简单的组件配置、组合成为复杂的应⽤。在Spring中,应⽤对象被声明式地组合,典型地是在⼀个XML⽂件⾥。
Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应⽤逻辑的开发留给了你。
  所有Spring的这些特征使你能够编写更⼲净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础⽀持。
91. 解释⼀下什么是 a o p?
AOP的全称是Aspect Orient Programming,即⾯向切⾯编程。是对OOP(Object Orient Programming)的⼀种补充,是⽤于处理⼀些具有横切性质的服务。常常⽤于⽇志输出、安全控制等。
AOP的相关术语。
Aspect
表⽰切⾯。切⼊业务流程的⼀个独⽴模块。⼀个应⽤程序可以拥有任意数量的切⾯。
Join point
表⽰连接点。也就是业务流程在运⾏过程中需要插⼊切⾯的具体位置。
Advice
表⽰通知。是切⾯的具体实现⽅法。可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)和环绕通知(Around)五种。实现⽅法具体属于哪类通知,是在配置⽂件和注解中指定的。例如,VerifyUser类的beforeAdvice ⽅法就是前置通知。
Pointcut
表⽰切⼊点。⽤于定义通知应该切⼊到哪些连接点上,不同的通知通常需要切⼊到不同的连接点上。
Target
表⽰⽬标对象。被⼀个或者多个切⾯所通知的对象。
Proxy
表⽰代理对象。将通知应⽤到⽬标对象之后被动态创建的对象。可以简单地理解为,代理对象为⽬标对象的业务逻辑功能加上被切⼊的切⾯所形成的对象。
Weaving
表⽰切⼊,也称为织⼊。将切⾯应⽤到⽬标对象从⽽创建⼀个新的代理对象的过程。这个过程可以发⽣在编译期、类装载期及运⾏期。
92. 解释⼀下什么是 io c?
IoC 容器:最主要是完成了完成对象的创建和依赖的管理注⼊
所谓控制反转,就是把原先我们代码⾥⾯需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。
那么必然的我们需要创建⼀个容器,同时需要⼀种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们可配置的⽂件
93. spr ing 有哪些主要模块?
93. spring 有哪些主要模块?
主要七⼤模块介绍
1. Spring AOP ⾯相切⾯编程
Spring的 AOP 封装包提供了符合AOP Alliance规范的⾯向⽅⾯的编程实现,让你可以定义,例如⽅法(method-interceptors)和切点(pointcuts),从逻辑上讲,从⽽减弱代码的功能耦合,清晰的被分离开。⽽且,利⽤source-level的元数据功能,还可以将各种⾏为信息合并到你的代码中
2. Spring ORM Hibernate|mybatis|JDO
ORM 封装包提供了常⽤的“对象/关系”映射APIs的集成层。 其中包括JPA、JDO、Hibernate 和 iBatis 。利⽤ORM封装包,可以混合使⽤所有Spring提供的特性进⾏“对象/关系”映射,如前边提到的简单声明性事务管理。
3. Spring Core 提供bean⼯⼚ IOC
Core封装包是框架的最基础部分,提供IOC和依赖注⼊特性。这⾥的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置
4. Spring Dao JDBC⽀持
DAO (Data Access Object)提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库⼚商特有的错误代码。 并且,JDBC封装包还提供了⼀种⽐编程性更好的声明性事务管理⽅法,不仅仅是实现了特定接⼝,⽽且对所有的POJOs(plain old Java objects)都适⽤
5. Spring Context 提供了关于UI⽀持,邮件⽀持等
构建于Core封装包基础上的 Context封装包,提供了⼀种框架式的对象访问⽅法,有些象JNDI注册器。Context封装包的特性得⾃于Beans封装包,并添加了对国际化(I18N)的⽀持(例如资源绑定),事件传播,资源装载的⽅式和Context的透明创建,⽐如说通过Servlet容器。
6. Spring Web 提供了web的⼀些⼯具类的⽀持
Spring中的 Web 包提供了基础的针对Web开发的集成特性,例如多⽅⽂件上传,利⽤Servlet listeners进⾏IOC容器初始化和针对Web 的ApplicationContext。当与WebWork或Struts⼀起使⽤Spring时,这个包使Spring可与其他框架结合。
7. Spring MVC 提供了web mvc , webviews , jsp ,pdf ,export
Spring中的MVC封装包提供了Web应⽤的Model-View-Controller(MVC)实现。Spring的MVC框架并不是仅仅提供⼀种传统的实现,它提供了⼀种清晰的分离模型,在领域模型代码和Web Form之间。并且,还可以借助Spring框架的其他特性。
94. spr ing 常⽤的注⼊⽅式有哪些?
94. spring 常⽤的注⼊⽅式有哪些?
注⼊⽅式主要有三种:构造⽅法注⼊,setter注⼊,基于注解的注⼊。
95. spring 中的 bea
95. spr ing 中的 bea n 是线程安全的吗?
不是
Spring框架中的Bean,或者说组件,获取实例的时候都是默认单例模式,这是在多线程开发的时候需要尤其注意的地⽅。
单例模式的意思是只有⼀个实例,例如在Spring容器中某⼀个类只有⼀个实例,⽽且⾃⾏实例化后并项整个系统提供这个实例,这个类称为单例类。
当多个⽤户同时请求⼀个服务时,容器会给每⼀个请求分配⼀个线程,这时多个线程会并发执⾏该请求对应的业务逻辑(成员⽅法),此时就要注意了,如果该处理逻辑中有对单例状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。
96. spr ing ⽀持⼏种 bea n 的作⽤域?
96. spring ⽀持⼏种 bea
当通过spring容器创建⼀个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作⽤域。Spring⽀持如下5种作⽤域:singleton:单例模式,在整个Spring IoC容器中,使⽤singleton定义的Bean将只有⼀个实例。当spring创建applicationContext容器的时候,spring会欲初始化所有的该作⽤域实例,加上lazy-init就可以避免预处理,
所以spring的controller、service是单例的
注:
1、不要在controller中定义成员变量。
2、万⼀必须要定义⼀个⾮静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式。
prototype:原型模式,每次通过容器的getBean⽅法获取prototype定义的Bean时,都将产⽣⼀个新的Bean实例,创建后spring将不再对其管理;
request:对于每次HTTP请求,使⽤request定义的Bean都将产⽣⼀个新实例,即每次HTTP请求将会产⽣不同的Bean实例。只有在Web应⽤中使⽤Spring时,该作⽤域才有效
session:对于每次HTTP Session,使⽤session定义的Bean都将产⽣⼀个新实例。同样只有在Web应⽤中使⽤Spring时,该作⽤域才有效globalsession:每个全局的HTTP Session,使⽤session定义的Bean都将产⽣⼀个新实例。典型情况下,仅在使⽤portlet context的时候有效。同样只有在Web应⽤中使⽤Spring时,该作⽤域才有效
97. spr ing ⾃动装配 bea n 有哪些⽅式?
97. spring ⾃动装配 bea
不可重复读 :不可重复读字⾯含义已经很明了了,⽐如事务A⾸先读取了⼀条数据,然后执⾏逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。
幻读 :⼩的时候数⼿指,第⼀次数⼗10个,第⼆次数是11个,怎么回事?产⽣幻觉了?幻读也是这样⼦,事务A⾸先根据条件索引得到10条数据,然后事务B改变了数据库⼀条数据,导致也符合事务A当时的搜索条件,这样事务A再次搜索发现有11条数据了,就产⽣了幻读。
99.1 spr ing 事务的传播级别:传播级别定义的是事务的控制范围
1) PROPAGATION_REQUIRED ,默认的spring事务传播级别,使⽤该级别的特点是,如果上下⽂中已经存在事务,那么就加⼊到事务中执⾏,如果当前上下⽂中不存在事务,则新建事务执⾏。所以这个级别通常能满⾜处理⼤多数的业务场景。⼤部分业务都是使⽤这个级别
2)PROPAGATION_SUPPORTS ,从字⾯意思就知道,supports,⽀持,该传播级别的特点是,如果上下⽂存在事务,则⽀持事务加⼊事务,如果没有事务,则使⽤⾮事务的⽅式执⾏。这个通常是⽤来处理那些并⾮原⼦性的⾮核⼼业务逻辑操作,⽐如查询操作。应⽤场景较少。
3)PROPAGATION_MANDATORY , 该级别的事务要求上下⽂中必须要存在事务,否则就会抛出异常!
配置该⽅式的传播级别是有效的控制上下⽂调⽤代码遗漏添加事务控制的保证⼿段。⽐如⼀段代码不能单独被调⽤执⾏,但是⼀旦被调⽤,就必须有事务包含的情况,就可以使⽤这个传播级别。
4)PROPAGATION_REQUIRES_NEW ,从字⾯即可知道,new,每次都要⼀个新事务,该传播级别的特点是,每次都会新建⼀个事务,并且同时将上下⽂中的事务挂起,执⾏当前新建事务完成以后,上下⽂事务恢复再执⾏。
这是⼀个很有⽤的传播级别,举⼀个应⽤场景:现在有⼀个发送100个红包的操作,在发送之前,要做⼀些系统的初始化、验证、数据记录操作,然后发送100封红包,然后再记录发送⽇志,发送⽇志要求100%的准确,如果⽇志不准确,那么整个⽗事务逻辑需要回滚。
怎么处理整个业务需求呢?就是通过这个PROPAGATION_REQUIRES_NEW 级别的事务传播控制就可以完成。发送红包的⼦事务不会直接影响到⽗事务的提交和回滚。
5)PROPAGATION_NOT_SUPPORTED ,这个也可以从字⾯得知,not supported ,不⽀持,当前级别的特点就是上下⽂中存在事务,则挂起事务,执⾏当前逻辑,结束后恢复上下⽂的事务。
这个级别有什么好处?可以帮助你将事务极可能的缩⼩。我们知道⼀个事务越⼤,它存在的风险也就越多。所以在处理事务的过程中,要保证尽可能的缩⼩范围。⽐如⼀段代码,是每次逻辑操作都必须调⽤
的,⽐如循环1000次的某个⾮核⼼业务逻辑操作。这样的代码如果包在事务中,势必造成事务太⼤,导致出现⼀些难以考虑周全的异常情况。所以这个事务这个级别的传播级别就派上⽤场了。⽤当前级别的事务模板抱起来就可以了。
6)PROPAGATION_NEVER ,该事务更严格,上⾯⼀个事务传播级别只是不⽀持⽽已,有事务就挂起,⽽PROPAGATION_NEVER传播级别要求上下⽂中不能存在事务,⼀旦有事务,就抛出runtime异常,强制停⽌执⾏!这个级别上辈⼦跟事务有仇。
spring aop应用场景7)PROPAGATION_NESTED ,字⾯也可知道,nested,嵌套级别事务。该传播级别特征是,如果上下⽂中存在事务,则嵌套事务执⾏,如果不存在事务,则新建事务。
100. 说⼀下 spr ing m vc 运⾏流程?
ing mvc
1.⽤户发送请求到DispatchServlet
2.DispatcherServlet收到请求调⽤HandlerMapping处理映射器
3.处理映射器HandlerMapping根据请求url到具体的处理器,⽣成处理器对象Handler及处理器Interceptor(如果有则⽣成)——
HandlerExcutionChain,⼀并返回给DispatcherServlet
HandlerExcutionChain:Handler和Interceptor集合
4.DispatcherServlet通过HandlerAdapter处理器适配器调⽤处理器。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。