Java篇——SpringMVC+Spring+Mybatis(附⾯试题)
万物皆有裂痕,那是光照进来的地⽅!
SpringMVC
1.Spring MVC概述:
Spring MVC是Spring提供的⼀个强⼤⽽灵活的web框架。借助于注解,Spring MVC提供了⼏乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器⼀般不直接处理请求,⽽是将其委托给Spring上下⽂中的其他bean,通过功能,这些bean被注⼊到控制器中。
Spring MVC主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。他的两个核⼼是两个核⼼:
处理器映射:选择使⽤哪个控制器来处理请求
视图解析器:选择结果应该如何渲染
通过以上两点,Spring MVC保证了如何选择控制处理请求和如何选择视图展现输出之间的松耦合。
2.SpringMVC运⾏原理
(1) Http请求:客户端请求提交到DispatcherServlet。
(2) 寻处理器:由DispatcherServlet控制器查询⼀个或多个HandlerMapping,到处理请求的Controller。
(3) 调⽤处理器:DispatcherServlet将请求提交到Controller。
(4)(5)调⽤业务处理和返回结果:Controller调⽤业务逻辑处理后,返回ModelAndView。
(6)(7)处理视图映射并返回模型: DispatcherServlet查询⼀个或多个ViewResoler视图解析器,到Mo
delAndView指定的视图。(8) Http响应:视图负责将结果显⽰到客户端。
3.SpringMVC接⼝解释
(1)DispatcherServlet接⼝:
Spring提供的前端控制器,所有的请求都有经过它来统⼀分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。
(2)HandlerMapping接⼝:
能够完成客户请求到Controller映射。
(3)Controller接⼝:
需要为并发⽤户处理上述请求,因此实现Controller接⼝时,必须保证线程安全并且可重⽤。
Controller将处理⽤户请求,这和Struts Action扮演的⾓⾊是⼀致的。⼀旦Controller处理完⽤户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。
从宏观⾓度考虑,DispatcherServlet是整个Web应⽤的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,⽽ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
(4)ViewResolver接⼝:
Spring提供的视图解析器(ViewResolver)在Web应⽤中查View对象,从⽽将相应结果渲染给客户。
4.DispatcherServlet:
是整个Spring MVC的核⼼。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要⼯作有以下三项:
(1)截获符合特定格式的URL请求。
(2)初始化DispatcherServlet上下⽂对应WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建⽴关联。
(3)初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。
Spring
1、什么是 Spring ?
Spring是⼀个开源框架,Spring是于2003 年兴起的⼀个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍⽣⽽来。它是为了解决企业应⽤开发的复杂性⽽创建的。框架的主要优势之⼀就是其分层架构,分层架构允许使⽤者选择使⽤哪⼀个组件,同时为 J2EE 应⽤程序开发提供集成的框架。Spring使⽤基本的JavaBean来完成以前只可能由EJB完成的事情。然⽽,Spring的⽤途不仅限于服务器端的开发。从简单性、可测试性和松耦合的⾓度⽽⾔,任何Java应⽤都可以从Spring中受益。Spring的核⼼是控制反转(IoC)和⾯向切⾯(AOP)。
简单来说,Spring是⼀个分层的JavaSE/EE full-stack(⼀站式) 轻量级开源框架。
2、Spring 特点
①、⽅便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进⾏控制,避免硬编码所造成的过度程序耦合。有了Spring,⽤户不必再为单实例模式类、属性⽂件解析等这些很底层的需求编写代码,可以更专注于上层的应⽤。
②、AOP编程的⽀持
通过Spring提供的AOP功能,⽅便进⾏⾯向切⾯的编程,许多不容易⽤传统OOP实现的功能可以通过AOP轻松应付。
③、声明式事务的⽀持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式⽅式灵活地进⾏事务的管理,提⾼开发效率和质量。
web前端基础面试题 ④、⽅便程序的测试
可以⽤⾮容器依赖的编程⽅式进⾏⼏乎所有的测试⼯作,在Spring⾥,测试不再是昂贵的操作,⽽是随⼿可做的事情。例如:Spring 对Junit4⽀持,可以通过注解⽅便的测试Spring程序。
⑤、⽅便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使⽤难度,Spring提供了对各种优秀框架(如
Struts,Hibernate、Hessian、Quartz)等的直接⽀持。
⑥、降低Java EE API的使⽤难度
Spring对很多难⽤的Java EE API(如JDBC,JavaMail,远程调⽤等)提供了⼀个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使⽤难度⼤为降低。
⑦、Java 源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠⼼独运,处处体现着⼤师对Java设计模式灵活运⽤以及对Java技术的⾼深造诣。Spring框架源码⽆疑是Java技术的最佳实践范例。如果想在短时间内迅速提⾼⾃⼰的Java技术⽔平和应⽤开发⽔平,学习和研究Spring源码将会使你收到意想不到的效果。
displayname无效什么意思3、Spring 框架结构
1、核⼼容器:核⼼容器提供 Spring 框架的基本功能(Spring Core)。核⼼容器的主要组件是 BeanFactory,它是⼯⼚模式的实现。BeanFactory 使⽤控制反转(IOC) 模式将应⽤程序的配置和依赖性规范与实际的应⽤程序代码分开。
2、Spring 上下⽂:Spring 上下⽂是⼀个配置⽂件,向 Spring框架提供上下⽂信息。Spring 上下⽂包括企业服务,例如JNDI、EJB、电⼦邮件、国际化、校验和调度功能。
3、Spring AOP:通过配置管理特性,Spring AOP 模块直接将⾯向切⾯的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象⽀持AOP。Spring AOP 模块为基于 Spring 的应⽤程序中的对象提供了事务管理服务。通过使⽤ Spring AOP,不⽤依赖 EJB 组件,就可以将声明性事务管理集成到应⽤程序中。
4、Spring DAO:JDBCDAO抽象层提供了有意义的异常层次结构,可⽤该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极⼤地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的⾯向 JDBC 的异常遵从通⽤的 DAO 异常层次结构。
5、Spring ORM:Spring 框架插⼊了若⼲个ORM框架,从⽽提供了 ORM 的对象关系⼯具,其中包括JDO、Hibernate和iBatisSQL Map。所有这些都遵从 Spring 的通⽤事务和 DAO 异常层次结构。
6、Spring Web 模块:Web 上下⽂模块建⽴在应⽤程序上下⽂模块之上,为基于 Web 的应⽤程序提供了上下⽂。所以,Spring框架⽀持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的⼯作。
7、Spring MVC 框架:MVC框架是⼀个全功能的构建 Web应⽤程序的 MVC 实现。通过策略接⼝,MVC框架变成为⾼度可配置的,MVC 容纳了⼤量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。模型由javabean构成,存放于Map;视图是⼀个接⼝,负责显⽰模型;控制器表⽰逻辑代码,是Controller的实现。Spring框架的功能可以⽤在任何J2EE服务器中,⼤多数功能也适⽤于不受管理的环境。Spring 的核⼼要点是:⽀持不绑定到特定 J2EE服务的可重⽤业务和数据访问对象。毫⽆疑问,这样的对象可以在不同
J2EE 环境(Web 或EJB)、独⽴应⽤程序、测试环境之间重⽤。
4、Spring 框架特征
轻量——从⼤⼩与开销两⽅⾯⽽⾔Spring都是轻量的。完整的Spring框架可以在⼀个⼤⼩只有1MB多的JAR⽂件⾥发布。并且Spring 所需的处理开销也是微不⾜道的。此外,Spring是⾮侵⼊式的:典型地,Spring应⽤中的对象不依赖于Spring的特定类。
控制反转——Spring通过⼀种称作控制反转(IoC)的技术促进了低耦合。当应⽤了IoC,⼀个对象依赖的其它对象会通过被动的⽅式传递进来,⽽不是这个对象⾃⼰创建或者查依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查依赖,⽽是容器在对象初始化时不等对象请求就主动将依赖传递给它。
⾯向切⾯——Spring提供了⾯向切⾯编程的丰富⽀持,允许通过分离应⽤的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进⾏内聚性的开发。应⽤对象只实现它们应该做的——完成业务逻辑——仅此⽽已。它们并不负责(甚⾄是意识)其它的系统级关注点,例如⽇志或事务⽀持。
容器——Spring包含并管理应⽤对象的配置和⽣命周期,在这个意义上它是⼀种容器,你可以配置你的每个bean如何被创建——基于⼀个可配置原型(prototype),你的bean可以创建⼀个单独的实例或者每次需要时都⽣成⼀个新的实例——以及它们是如何相互关联的。然⽽,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞⼤与笨重的,难以使⽤。
框架——Spring可以将简单的组件配置、组合成为复杂的应⽤。在Spring中,应⽤对象被声明式地组合,典型地是在⼀个XML⽂件⾥。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应⽤逻辑的开发留给了你。
5、Spring 优点
1.低侵⼊式设计,代码污染极低
2.独⽴于各种应⽤服务器,基于Spring框架的应⽤,可以真正实现Write Once,Run Anywhere的承诺
3.Spring的DI机制降低了业务对象替换的复杂性,提⾼了组件之间的解耦
4.Spring的AOP⽀持允许将⼀些通⽤任务如安全、事务、⽇志等进⾏集中式管理,从⽽提供了更好的复⽤
5.Spring的ORM和DAO提供了与第三⽅持久层框架的良好整合,并简化了底层的数据库访问
6.Spring并不强制应⽤完全依赖于Spring,开发者可⾃由选⽤Spring框架的部分或全部
spring两⼤核⼼技术
IOC/DI:控制反转/依赖注⼊,⼀个意思
AOP:⾯向切⾯编程
什么是依赖?什么是注⼊?
(1)依赖就是某个类必须依托另外⼀个类完成⼯作,那么就说这个类依赖于另外⼀个类。
例如:Colleage类⾥⾯有⼀个Student类型的属性,那么Colleage就依赖于Student,Student就是Colleage的⼀个依赖。
(2)注⼊就是某个类在需要某个依赖的时候,由容器创建这个依赖并给这个宿主类使⽤,不需要宿主类⾃⼰new这个依赖了。
什么是控制反转?docx源码php
控制反转跟依赖注⼊说的是⼀回事⼉,例如原来Colleage控制着Student的⽣成或者不⽣成,现在反了,Colleage不控制了,由Spring 容器去
控制Student的⽣成。
容器
spring容器也成为DI容器或者IOC容器,就好⽐tomcat是servlet容器⼀样,spring容器"存放"的
是bean对象。
安装spring插件
springsource-tool-suite-3.4.0.zip
使⽤Spring IoC的步骤
第⼀,导⼊jar包
注意版本冲突、不要把xml这些放到path路径中
第⼆,配置spring⽂件
1、set⽅法注⼊
<bean id="hellospring" class="dashuju.spring.helloworld.HelloSpring" >
<property name="content" value="我们在学习"/>
</bean>
注意:
(1)id值可以随便取⼀个合法名称,但是必须保证唯⼀
(2)class是完全限定名
(3)property中的name值是对应的public setXXX⽅法名称
(4)value就是要注⼊给id指定的对象的属性值,如果值⾥⾯有特殊符号例如&<;等可以⽤<value><![CDATA[我们在&学习]]> </value>解决bmobsdk
(5)如果没有指定⽤constructor-arg构造⽅法注⼊,则该类必须有⽆参构造⽅法
(6)指定属性的数据类型,例如<value type="int">5</value>
(7)注⼊null值—<null/>标签
(8)单例情况l中的配置顺序会决定对象的创建顺序,多例情况只有在getBean时才创建,⽆所谓顺序
如果有关系依赖的话,例如A的创建依赖B的创建,把B配置在A的后⾯也是可以的,不会影响A的创建。
2、构造器注⼊
(1)多参构造⽅法⽤索引指定参数顺序
(2)还可继续使⽤property为其他属性赋值
<bean id="hellobeijing_three" class="dashuju.spring.helloworld.HelloBeijing">
pip install jupyter<constructor-arg index="0" value="北京"/>
<constructor-arg index="1" value="张晓东"/>
<property name="age" value="99"></property>
</bean>
注意:
(1)如果配置的构造⽅法产⽣了歧义,可以为属性指定type属性以⽰区分
3、命名空间注⼊
(1)xml必须引⼊p名称空间
(2)直接为属性赋值,例如:p:city="北京"
(3)引⽤另外⼀个bean为属性赋值,例如p:hellolist-ref="bigList"
4、静态⼯⼚注⼊
(1)要求静态⼯⼚⾥⾯有⼀个静态属性
(2)在static代码块中将上⾯的静态属性初始化
(3)要求⼯⼚⽅法必须是static类型的
(4)配置xml⽂件,⽤factory-method指向⼯⼚⽅法的名称,如果⼯⼚⽅法需要传⼊参数则⽤constructor-arg来配置参数js字符串转数字精度
<bean id="staticbean" class="dashuju.spring.staticbean.GradeFactory"
factory-method="getGrade">
<constructor-arg value="1611"></constructor-arg>
</bean>
(Bean(id)返回的不是⼯⼚类,⽽是静态⽅法的返回类型
5、FactoryBean接⼝注⼊
(1)为什么我们⾃⼰的bean要借助FactoryBean接⼝?
因为某些bean初始化可能很复杂,跟业务相关,我们可以通过该接⼝提供的getObject⽅法去处理这些业务,然后返回⼀个我们想要的bean
(2)需要我们⾃⼰的bean实现FactoryBean接⼝
(3)要重写getObject()⽅法,重写的⽬的就是返回我想要的bean,注意getObject()⽆参数
(4)配置xml⽂件
注意:
(1)需要我们⾃⼰的类实现FactoryBean接⼝
(2)需要重写getObject⽅法
(Bean(id)返回值不是XXXFactoryBean对象,⽽是getObject⽅法返回的对象
(4)如果GradeFactoryBean中没有属性,xml中就不⽤配置property标签
(5)默认创建时带T泛型,可以不⽤泛型
(6)如果需要得到XXXFactoryBean对象该怎么办呢?在id前加“&”即可,例如ct.getBean("&factorybean");
6、静态⼯⼚注⼊、FactoryBean接⼝注⼊的总结
(1)两者返回的对象都不是class类本⾝
(2)静态⼯⼚注⼊返回的对象是静态⼯⼚⽅法返回的对象
(3)FactoryBean接⼝注⼊返回的是getObject()⽅法返回的对象
(4)静态⼯⼚注⼊,在xml配置上,需要⽤factory-method属性指明⼯⼚静态⽅法
(5)FactoryBean接⼝注⼊,xml配置上跟普通配置⼀样,但是要求class类实现FactoryBean接⼝
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论