一、Spring工作原理:
1.Spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
3.DispatcherServlet请请求提交到目标Controller
4.Controller进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6.视图对象负责渲染返回给客户端。
二、请你谈谈SSH整合:
SSH:
Struts(表示层)+Spring(业务层)+Hibernate(持久层)
1.Struts:
Struts是一个表示层框架,主要作用是界面展示,接收请求,分发请求。
在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。(View:沿用 JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet,struts-config.xml,Action)
2.Hibernate:
Hibernate是一个持久层框架,它只负责与关系数据库的操作。
3.Spring:
Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。
三、介绍一下Spring的事务管理:
事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。
这样可以防止出现脏数据,防止数据库数据出现问题。
开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
1.Spring提供了几个关于事务处理的类:
1)TransactionDefinition //事务属性定义
2)TranscationStatus //代表了当前的事务,可以提交,回滚。
3)PlatformTransactionManager这个是Spring提供的用于管理事务的基础接口,其下有一个实现的抽象类 AbstractPlatformTransactionManager,我们使用的事务管理类例如 DataSourceTransactionManager等都是这个类的子类。
2.一般事务定义步骤:
TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
try
{ //do sth
transactionManager.commit(ts);
}
catch(Exception e){transactionManager.rollback(ts);}
Spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。
编程式主要使用transactionTemplate。省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.
void add(){
transactionTemplate.execute( new TransactionCallback(){
pulic Object doInTransaction(TransactionStatus ts)
{ //do sth}
}
}
声明式:
使用TransactionProxyFactoryBean:
PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly
围绕Poxy的动态代理 能够自动的提交和回滚事务
org.Springframework.transaction.interceptor.TransactionProxyFactoryBean
PROPAGATION_REQUIRED-支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS-支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY-支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW-新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED-以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER-以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED-如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
四、Spring里面如何配置数据库驱动?
使用”org.Springframework.jdbc.datasource.DriverManagerDataSource”数据源来配置数据库驱动。示例如下:
org.hsqldb.jdbcDriver jdbc:hsqldb:db/appfuse sa
五、Spring里面applicationContext.xml文件能不能改成其他文件名?
ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。 你可以通过定义一个元素名字为”contextConfigLocation”来改变Spring配置文件的位置。示例如下:
org.Springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/xyz.xml
六、如何在web应用里面配置Spring?
在web.xml中加入如下同容,在启动web服务器时加载/WEB-INF/applicationContext.xml中的内容。
context
org.Springframework.web.context.ContextLoaderServlet
通过如下类得到ApplicationContext实例
WebApplicationContextUtils.getWebApplicationContext
七、Spring里面如何定义hibernate mapping?
添加hibernate mapping 文件到web/WEB-INF目录下的applicationContext.xml文件里面。示例如下:
org/appfuse/model/User.hbm.xml
八、解释一下Dependency injection(DI,依赖注入)和IOC(Inversion of control,控制反转)?
1.依赖注入DI是一个程序设计模式和架构模型, 一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:把一个数据库连接已参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接。
2.控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖
3.应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。
九、Spring中的BeanFactory与ApplicationContext的作用有哪些?
1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。
2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:
1) 国际化支持
2) 资源访问:Resource rs = ctx. getResource(”classpath:config.properties”), “file:c:/config.properties”
3)事件传递:通过实现ApplicationContextAware接口
3. 常用的获取ApplicationContext的方法:
FileSystemXmlApplicationContext:从文件系统或者url指定的xml配置文件创建,参数为配置文件名或文件名数组
ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配置文件
WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者 servlet来实现
org.Springframework.web.context.ContextLoaderListener
context
org.Springframework.web.context.ContextLoaderServlet
这两种方式都默认配置文件为web-inf/applicationContext.xml,也可使用context-param指定配置文件
contextConfigLocation /WEB-INF/myApplicationContext.xml
十、如何在web环境中配置applicationContext.xml文件?
org.Springframework.web.context.ContextLoaderListener 或:
context
org.Springframework.web.context.ContextLoaderServlet
通过如下方法取出applicationContext实例:
ApplicationContext ac=WebApplicationContextUtils.getWebApplicationContext(this.getServletContext);
十一、如何配置Spring+struts?
1.在struts-config.xml加入一个插件,通过它加载applicationContext.xml
2.在struts-config.xml修改action-mapping标记,具体action交给了DelegateActionProxy
3.通过DelegateActionProxy进入一Spring的环境。
4.在Spring的applicationContext.xml加入
十二、Spring+hibernate的配置文件中的主要类有那些?如何配置?
1.dataSource
2.sessionFactory:hibernate.cfg.xml
3.transactionManager
4.userDao (extends HibernateDaoSupport)
5.sessionFactory
6.facade
7.proxy
8.sessionFactory
9.transactionManager
10.facade
在myeclipse中先加入Spring环境再加入hibernate环境。
如果Spring与hibernate结合在一起可以不需要hibernate.cfg.xml文件是否正确
十三、Spring中的核心类有那些,各有什么作用?
1.BeanFactory:产生一个新的实例,可以实现单例模式
2.BeanWrapper:提供统一的get及set方法
3.ApplicationContext:提供框架的实现,包括BeanFactory的所有功能
十四、什么是aop,aop的作用是什么?
1.面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。
2.除了类(classes)以外,AOP提供了切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理
Spring的一个关键的组件就是AOP框架,可以自由选择是否使用AOP
3.提供声明式企业服务,特别是为了替代
EJB声明式服务。最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上
4.允许用户实现自定义切面,用AOP来完善OOP的使用
可以把Spring AOP看作是对Spring的一种增强
十五、AOP里面重要的几个名词概念解释:
1.切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是
J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。
2.连接点(Joinpoint): 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。
3.通知(Advice): 在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。
4.切入点(Pointcut): 匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
5.引入(Introduction): (也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。 例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
6.目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。
7.AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。
8.织入(Weaving): 把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。
9.通知的类型:
1)前置通知(Before advice): 在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
2)返回后通知(After returning advice): 在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
3)抛出异常后通知(After throwing advice): 在方法抛出异常退出时执行的通知。
4)后通知(After (finally) advice): 当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
5)环绕通知(Around Advice): 包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
环绕通知是最常用的一种通知类型。大部分基于拦截的AOP框架,例如Nanning和JBoss4,都只提供环绕通知。
6)切入点(pointcut)和连接点(join point)匹配的概念是AOP的关键,这使得AOP不同于其它仅仅提供拦截功能的旧技术。 切入点使得定位通知(advice)可独立于OO层次。 例如,一个提供声明式事务管理的around通知可以被应用到一组横跨多个对象中的方法上(例如服务层的所有业务操作)。