spring相关知识点

来源:互联网 发布:程序员 多个显示器 编辑:程序博客网 时间:2024/05/20 14:44

1.定义:Spring是一个轻量级,开源的,非侵入式的控制反转(IoC)和面向切面(AOP)的容器框架。 
2.特点:

◆轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并 且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。 
◆控制反转——Spring通过一种称作控制反转(IOC)的技术促进了松耦合。当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IOC与JNDI相反——不 是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。 
◆面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务()管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们 并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。 
◆容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是 一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生 成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。 
◆框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

3.Spring有如下优点: 
◆降低了组件之间的耦合性,实现了软件各层之间的解耦;
◆可以容易使用众多的服务,如事务管理等;
◆容器提供了单例模式支持,如spring bean的作用域;
◆容器提供了众多的辅助类,能加快应用的开发;
◆容器提供了AOP技术,利用它容易实现如权限拦截,运行期监控等功能;
◆Spring的DI机制降低了业务对象替换的复杂性 
◆可以无缝的和其他框架融合在一起,充当粘合剂;因为它提供了很多不同的框架的支持类,如struts,hibernate等;
◆低侵入式设计,代码污染极低 
◆独立于各种应用服务器,

 


代理模式
1.定义:是为其他对象提供一种代理,以控制对这个对象的访问;
代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。
2.优点:
(1)职责清晰:真实的角色就是实现实际业务逻辑,不关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰。
(2)高扩展性:具体主题角色是随时都会发生变化的,只要它实现了接口,代理类完全就可以在不做任何修改的情况下使用
(3)智能化;
3.静态代理和动态代理的区别:
静态代理的代理类是在程序运行前创建的,其代理类和委托类的关系在运行前确定的;
而动态代理的代理类是程序在运行期由JVM根据反射机制动态生成,其代理类和委托类的关系在运行时确定的;
4.Spring中的两种动态代理模式的区别:
CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理


(-)、静态代理 
1.定义:在程序运行前就已存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
2.优缺点:
优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。 
缺点:
a.代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,
静态代理在程序规模稍大时就无法胜任了。 
b.如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。

(二).动态代理
1.定义:在程序运行期间由JVM根据反射等机制动态的生成,代理类和委托类的关系是在程序运行时确定。AOP的核心是动态代理机制;
2优缺点:
优点:动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler.invoke).
这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。
3.动态代理实现步骤:
a. 实现InvocationHandler接口创建自己的调用处理器 
b. 给Proxy类提供ClassLoader 和 代理接口类型数组(接口的数组)创建动态代理类 
c. 以调用处理器类型为参数,利用反射机制得到动态代理类的构造函数 
d. 以调用处理器对象为参数,利用动态代理类的构造函数创建动态代理类对象 
(根据动态代理类的构造函数获得动态代理类的实例);

// InvocationHandlerImpl 实现了 InvocationHandler 接口,并能实现方法调用从代理类到委托类的分派转发 
InvocationHandler handler = new InvocationHandlerImpl(..); 
// 通过 Proxy 为包括 Interface 接口在内的一组接口动态创建代理类的类对象 
Class clazz = Proxy.getProxyClass(classLoader, new Class[] { Interface.class, ... }); 
// 通过反射从生成的类对象获得构造函数对象 
Constructor constructor = clazz.getConstructor(new Class[] { InvocationHandler.class }); 
// 通过构造函数对象创建动态代理类实例 
Interface Proxy = (Interface)constructor.newInstance(new Object[] { handler });


(三).Cglib 动态代理
Cglib动态代理:JDk动态代理的首要条件是:被代理类必须实现一个接口;如果没有实现接口,则使用Cglib代理;
CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。

没有接口的话,会强制使用cglib代理,前提得有jar,需要强制使用cglib的时候
设置<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

 


IOC容器
1.定义:IOC:(Inversion of control)控制反转又称依赖注入,指的是一个对象容器,将对象的依赖关系交由ioc容器来管理;
控制器中的javaBean 对象有指定的配置文件映射生成,可以配置javaBean的依赖关系需要的对象有ioc提供。
2.方式:set方法注入,接口注入,构造方法注入;
3.作用:Spring中IOC 最大的好处是便于替换对象,只要用 JavaBean 属性和配置文件加入依赖性(协作对象),
然后可以很容易地在需要时替换具有类似接口的协作对象。 
4.作用域:默认的情况下是singleton;
singleton : 在每个Spring ioc容器中一个bean定义对应一个对象实例;
prototype : 在每个Spring ioc容器中一个bean定义对应多个对象实例;
request : 在一次HTTP请求中,一个bean定义对应一个对象实例;该作用域仅基于web的Spring ApplicationContext 情形下才有用;
session : 在一个HTTP Session 中,一个bean定义对应一个对象实例;该作用域仅基于web的Spring ApplicationContext 情形下才有用;
global session : 全局的HTTP Session 中,在每个Spring ioc容器中一个bean定义对应一个对象实例;
该作用域仅基于web的Spring ApplicationContext 情形下才有用;


AOP框架
1.定义:AOP(面向切面) 是将应用程序中的非业务逻辑代码提取出来,封装成切面。
从而实现了切面的复用,并降低了非业务逻辑代码和业务代码的耦合性。在不改变代码结构的情况下增强或控制了这个对象的行为。
spring中采用AOP进行事务管理。
2.怎么理解AOP?
AOP是面向切面编程,是面向对象的补充;
使用AOP,降低了代码的耦合度,提高了代码的重用;
Spring中的切面对关注点进行模块化,例如横切多个类型和对象的事务管理 
所以,可以把Spring AOP看作是对Spring的一种增强;
3.切入点:指切面应用到的位置,具体切入到哪些类,哪些方法;
4.连接点:指切面代码可以被切入到目标对象的位置(属性,方法)。
5.通知定义: 特定连接点所采取的动作;
6.通知有四种:
MethodBeforeAdvice(前置通知)
AfterReturningAdvice(后置通知)
ThrowsAdvice(异常通知)
MethodInterceptor(环绕通知)

spring的事务管理
1.定义:Spring 的事务管理:它保证了一系列操作可以作为一个工作单元,所有的操作被执行的机制。
执行后只有两种结果,要么全部成功,要么全部失败。
防止出现脏数据,防止数据库数据出现问题。
2.Spring提供的事务管理可以分为两类:编程式的和声明式的。
编程式事务,比较灵活,但是代码量大,存在重复的代码比较多;
声明式则比编程式更灵活;在使用Spring的声明式事务时不需要编写任何代码,它通过AOP实现事务管理。
3.spring是怎么实现事务管理:在配置文件中声明事务管理器,然后配置事务属性,定义事务切入点,最后通过AOP实现事务管理;
4.事务有七种传播性,四种隔离级别;


请你谈谈SSH整合: 
SSH: (MVC)
Action Service Dao
Struts(表示层)+Spring(业务层)+Hibernate(持久层) 
Struts: 
Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。 
在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet,struts-config.xml,Action) 
Hibernate: 
Hibernate是一个持久层框架,它只负责与关系数据库的操作。 Hiberate属于M层次;
Spring: 
Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。Spring 属于C层次;


struts2
1.struts2的流程。
(1)启动web服务器时,解析web.xml,初始化servlet;
(2)接收jsp页面.action的请求;
(3)请求会提交到一系列Filter过滤器;
(4)请求到达FilterDispatch(核心类)后,核心类会询问ActionMapper是否调用某个Action来处理请求;
(每次发送一个Request,FilterDispatcher都会调用doFilter方法,doFilter方法中将struts.xml被解析成ActionMapper)
(5)如果ActionMapper 决定调用某个Action,核心类会将请求提交到ActionProxy, 由其进行处理;
(6)ActionProxy通过Configuration Manager()询问框架的Configuration (Struts.xml)配置文件,找到需要调用的Action类(Action被调用者);
(7)ActionProxy创建一个ActionInvocation(Action的调用者)实例,而ActionInvocation通过代理模式调用Action类;
在调用Action前ActionInvocation会根据配置加载Action 的所有拦截器;
(8)Action执行完毕后,返回一个result字符串,此时再按相反的顺序通过Interceptor拦截器。
(9)最后通过struts.xml中的配置找到对应的result;
(10)响应的返回是通过我们在web.xml中配置的过滤器

 

2.OGNL 定义:
OGNL是Object-Graph Navigation Language 的缩写,全称是对象图导航语言,可以任意获取对象的属性或者调用对象的方法,
能够遍历整个对象的结构图,实现对象属性类型的转换等功能。
OGNL上下文实际上就是一个Map对象,它里面放了很多javaBeand对象,它有一上下文根对象(ValueStack)。

3.Struts与Spring是如何整合的?
需要的jar文件为:Spring和Struts2框架本身需要的jar文件以及他们所依赖的jar文件,比如commons-logging.jar等等,
另外还需要Struts2发布包中的struts2-spring-plugin-x.xx.jar。

注:Struts与Spring结合使用的体现:
struts2中拦截是AOP的一种实现策略。
struts2中获取对象是使用了IOC的模式。
(Struts2处理Action过程中调用的方法(“execute”方法)是不带参数的。
那如何获取所需要的对象呢?答案是使用IoC的模式)

4.模型驱动和属性驱动区别:
属性驱动:Action 的JSP页面中的每一个Form的name都在Action中有一个属性与之对应;
(用Action的属性直接封装请求属性);
模型驱动:Struts2的模型驱动其实和Struts1中的ActionForm有点类似,在Struts1中每一个Action都必须有一个ActionForm(bean类)与之对应,
而Struts2.0中,每一个Action同样需要提供一个POJO对象,用来封装表单属性。
(使用JavaBean来封装来回请求的参数);
区别:
(1)模型驱动的Action必须实现ModelDriven接口,而且要提供相应的泛型,这里当然就是具体使用的Java Bean了。
(2)实现ModelDriven的getModel方法,其实就是简单的返回泛型的一个对象。
(3)在Action提供一个泛型的私有对象,这里就是定义一个User的user对象,并提供相应的getter。

好了,上面的三件事做完之后,Action就会去自动调用User的setter将表单中的name属性的值赋给User中的属性。
而Action的后续处理的Jsp页面后者是Servlet就可以使用user对象了。

5.struts2有哪些优点?
1)Struts2的应用可以不依赖于Servlet API。 Struts2的这种设计属于无侵入式设计;  
2)struts2提供了拦截器,实现如参数拦截注入等功能;  
3)struts2使用OGNL进行类型转换,可以把特殊的请求参数转换成需要的类型;  
4)Struts2的输入校验可以对指定某个方法进行校验; 
5)多种表现层技术,如:JSP、freeMarker、Velocity等;  
6)提供了全局范围、包范围和Action范围的国际化资源文件管理实现 


6.struts1与struts2的区别。

a.接口和抽象类的对比
Struts1 要求Action类继承一个抽象基类(DispatchAction类),使用抽象类编程而不是接口。
Struts2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。

b.线程安全的对比
Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。
Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。

c.封装请求参数的对比
Struts1 使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承一个基类:DispatchAction。
Struts2 直接使用Action属性来封装用户请求属性.

d.类型转换的对比
Struts1 ActionForm 属性通常都是String类型。使用Commons-Beanutils进行类型转换,每个类一个转换器,转换器是不可配置的;
Struts2 使用OGNL进行类型转换,支持基本数据类型和常用对象之间的转换。

e.依赖方面的对比
Struts1 Action依赖于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。
struts2 允许Action脱离
运行,从而降低了测试Action的难度(ognl 中的ActionContext)。

f.可测试性的对比
Struts1 Action的execute方法依赖于Servlet API,这使得Action的测试要依赖于Web容器;
如果要脱离web容器,则要通过第三方扩展:Struts TestCase;
Struts2 Action可以通过初始化、设置属性、调用方法来测试。 
g.校验方面的对比
struts1 支持ActionForm重写validate方法的手动校验,通过整合Commonsalidator框架来完成数据校验。 
strust2 支持重写validate方法进行校验,也支持整合XWork校验框架进行校验

注:
struts2中拦截是AOP的一种实现策略。
struts2中获取对象是使用了IOC的模式。


Spring MVC

Spring MVC框架:
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还可以是 Struts 这样的 Web 框架。通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。


spring mvc 获取request对象:
(1). RequestAttributes ra = RequestContextHolder.getRequestAttributes(); 
HttpServletRequest request = ((ServletRequestAttributes)ra).getRequest(); 
(2). 用注解的形式将request对象以参数的形式传人进来。(跟传人bean一样的)

关于Spring MVC Controller 层的单元测试,测试准备工作:
1、搭建测试Web环境
@RunWith(UnitilsJUnit4TestClassRunner.class)
@SpringApplicationContext({"classpath:*.xml","file:src/main/webapp/WEB-INF/spring-configuration/*.xml","file:src/main/webapp/WEB-INF/*.xml" })
2、注入Controller 类
@SpringBeanByType
BeanController controller;
3、编写测试数据
测试数据的文件名一定要与测试类的文件名相同,比如测试数据BeanControllerTest.xml ,测试类 BeanControllerTest。
4、注入测试数据
@Test
@DataSet
public void testBean(){}


Spring MVC的注解:
1.@Controller注解标识一个控制器,
2.@RequestMapping注解标记一个访问的路径(/index.jsp),return "index"标记返回视图(index.jsp);
(注:如果@RequestMapping注解在类级别上,则表示一相对路径(命名空间);在方法级别上,则标记访问的路径;)
3.使用@PathVariable 获取传入参数
4.使用@RequestParam 注解获取GET请求或POST请求提交的参数;
5.使用@CookieValue :获取Cookie的值:
6.获取PrintWriter:可以直接在Controller的方法中传入PrintWriter对象,就可以在方法中使用:
7.ModelAttribute:
8.Resource;

可以传入方法的参数类型:
将HttpServletRequest、HttpServletResponse、HttpSession作为入参。但是,如果第一次访问页面,HttpSession没被创建,可能会出错;

 


Spring MVC 重要组件 
1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系
统的其他模块负责负责对请求进行真正的处理工作。 
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 
3.DispatcherServlet将请求提交到目标Controller 
4.Controller进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到
ModelAndView对象指定的视图对象
6.视图对象负责渲染返回给客户端

 

在web.xml配置DispatcherServlet,
<servlet><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class></servlet>
在Dispatcher_servlet中的配置:
<!-- 启动的时候,你要到这个包下面去扫描所有类的注解,将类生成实例放到ioc容器 -->
<context:component-scan base-package="com.lsit.controller" />
<!-- DefaultAnnotationHandlerMapping 通过注解,把一个URL映射到Controller类上 -->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 
<!-- 视图解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/app/jsp/" />
<property name="suffix" value=".jsp" />
</bean>

原创粉丝点击