1、 什么是Spring框架?使用Spring框架能带来哪些好处?Spring框架有哪些主要模块?
Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。
为什么说Spring是一个一站式的轻量级开源框架呢?
JavaEE开发可分成三层架构,针对JavaEE的三层结构,每一层Spring都提供了不同的解决技术。
• WEB层:SpringMVC
• 业务层:Spring的IOC、AOP
• 持久层:Spring的JDBCTemplate(Spring的JDBC模板,ORM模板用于整合其他的持久层框架)
Spring帮助开发者解决了开发中基础性的问题,使得开 发人员可以专注于应用程序的开发。
Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境 中安心的集成Spr ing框架,不必担心Spr ing是如何在后台进行工作的。
主要模块:
Spring Core:核心类库,提供IOC服务;
Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);
Spring AOP:AOP服务;
Spring DAO:指示你写 DAO 操作、写好 DAO 操作的一些规范,@Repository 对其进行注解,对JDBC的抽象,简化了数据访问异常的处理;
Spring-JDBC: 提供了 Jdbc 模板类,它移除了连接代码以帮你专注于 SQL 查询和相关参数,对你的 DAO 进行扩展开发
Spring ORM:对现有的ORM框架(JPA,JDO,Hibernate,iBatis)的支持;
Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;
Spring MVC:提供面向Web应用的Model-View-Controller实现
(1)核心容器:包括Core、Beans、Context、EL 模块。
Core 模块:封装了框架依赖的最底层部分,包括资源访问、类型转换及一些常用工具类。
Beans 模块:提供了框架的基础部分,包括反转控制和依赖注入。其中Bean Factory 是容器核心,本质是“工厂设计模式”的实现,而且无需编程实现“单例设计模式”,单例完全由容器控制,而且提倡面向接口编程,而非面向实现编程;所有应用程序对象及对象间关系由框架管理,从而真正把你从程序逻辑中把维护对象之间的依赖关系提取出来,所有这些依赖关系都由BeanFactory 来维护。
Context 模块:以Core 和Beans 为基础,集成Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等;核心接口是ApplicationContext。
EL 模块:提供强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring 容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。
(2)AOP、Aspects 模块:
AOP 模块:Spring AOP 模块提供了符合 AOP Alliance 规范的面向方面的编程(aspect-oriented programming)实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中;这样各专其职,降低业务逻辑和通用功能的耦合。
Aspects 模块:提供了对AspectJ 的集成,AspectJ 提供了比Spring ASP 更强大的功能。
数据访问/集成模块:该模块包括了JDBC、ORM、OXM、JMS 和事务管理。事务模块:该模块用于Spring 管理事务,只要是Spring 管理对象都能得到Spring 管理事务的好处,无需在代码中进行事务控制了,而且支持编程和声明性的事务管理。
(3)Data Access
JDBC 模块:提供了一个JBDC 的样例模板,使用这些模板能消除传统冗长的JDBC 编码还有必须的事务控制,而且能享受到Spring 管理事务的好处。
ORM模块:提供与流行的“对象-关系”映射框架的无缝集成,包括Hibernate、JPA、MyBatis 等。而且可以使用Spring 事务管理,无需额外控制事务。
OXM 模块:提供了一个对Object/XML 映射实现,将java 对象映射成XML 数据,或者将XML 数据映射成java对象,Object/XML 映射实现包括JAXB、Castor、XMLBeans 和XStream。
JMS 模块:用于JMS(Java Messaging Service),提供一套 “消息生产者、消息消费者”模板用于更加简单的使用JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
(4)Web/Remoting 模块:Web/Remoting 模块包含了Web、Web-Servlet、Web-Struts、Web-Porlet 模块。
Web 模块:提供了基础的web 功能。例如多文件上传、集成IoC 容器、远程过程访问(RMI、Hessian、Burlap)以及Web Service 支持,并提供一个RestTemplate 类来提供方便的Restful services 访问。
Web-Servlet 模块:提供了一个Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的JSP 标签,完全无缝与Spring 其他技术协作。
Web-Struts 模块:提供了与Struts 无缝集成,Struts1.x 和Struts2.x 都支持
Test 模块: Spring 支持Junit 和TestNG 测试框架,而且还额外提供了一些基于Spring 的测试功能,比如在测试Web 框架时,模拟Http 请求的功能。
2、什么是AOP(Aspect Oriented Programming)编程?主要应用在那些方面?
AOP(Aspect Oriented Programming)编程:
将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立,然后切入到业务逻辑的中,进而改 变这些行为的时候不影响业务逻辑的代码,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP不是一种技术,实际上是编程思想。凡是符合AOP思想的技术,都可以看成是AOP的实现。
主要的应用:日志记录,性能统计,安全控制,事务处理,异常处理等等。
3、AOP涉及的概念?
关注点:
关注点,重复代码就叫做关注点;
切面:
关注点形成的类,就叫切面(类)!面向切面编程,就是指 对很多功能都有的重复的代码抽取,再在运行的时候网业务方法上动态植入“切面类代码”。
切入点:
是一个或一组连接点,通知将在这些位置执行,执行目标对象方法,动态植入切面代码。可以通过切入点表达式,指定拦截哪些类的哪些方法; 给指定的类在运行的时候植入切面类代码
连接点:
被拦截到的点,因为Spring 只支持方法类型的连接点,所以在Spring 中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。
织入:
是将切面应用到其他应用类型或对象连接或创建一个被通知对象的过程。织入可以在编译时,加载时,或运行时完成。
4、核心关注点和横切关注点区别?
业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
5、关注点和横切关注的区别?
关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。
6、AOP底层实现原理?
用代理模式,通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现) ,AOP核心技术面向切面编程。
代理参考:代理模式
7、事务基本特性
⑴ 原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
⑵ 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
⑶ 隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。
⑷ 持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
8、spring事务传播行为

9、什么是Spring IOC 容器?IOC 的优点是什么?原理实现?
IOC 控制反转:Spring IOC 负责创建对象,通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。
IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI 查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC 容器支持加载服务时的饿汉式初始化和懒加载。
使用反射机制+XML技术实现
在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。
10、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
答:XML文档定义分为DTD和Schema两种形式,二者都是对XML语法的约束,其本质区别在于Schema本身也是一个XML文件,可以被XML解析器解析,而且可以为XML承载的数据定义类型,约束能力较之DTD更强大。对XML的解析主要有DOM(文档对象模型,Document Object Model)、SAX(Simple API for XML)和StAX(Java 6中引入的新的解析XML的方式,Streaming API for XML),其中DOM处理大型文件时其性能下降的非常厉害,这个问题是由DOM树结构占用的内存较多造成的,而且DOM解析方式必须在解析文件之前把整个文档装入内存,适合对XML的随机访问(典型的用空间换取时间的策略);SAX是事件驱动型的XML解析方式,它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过事件回调代码来处理XML文件,适合对XML的顺序访问;顾名思义,StAX把重点放在流上,实际上StAX与其他解析方式的本质区别就在于应用程序能够把XML作为一个事件流来处理。将XML作为一组事件来处理的想法并不新颖(SAX就是这样做的),但不同之处在于StAX允许应用程序代码把这些事件逐个拉出来,而不用提供在解析器方便时从解析器中接收事件的处理程序。
11、Scopep配置
作用域scope配置项
作用域限定了Spring Bean的作用范围,在Spring配置文件定义Bean时,通过声明scope配置项,可以灵活定义Bean的作用范围。例如,当你希望每次IOC容器返回的Bean是同一个实例时,可以设置scope为singleton;当你希望每次IOC容器返回的Bean实例是一个新的实例时,可以设置scope为prototype。
scope配置项有5个属性,用于描述不同的作用域。
① singleton
使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。
② prototype
使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
③ request
该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
④ session
该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
⑤ global-session
该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。
12、转发和跳转(重定向)
1、转发使用的是getRequestDispatcher()方法;重定向使用的是sendRedirect();
2、转发:浏览器URL的地址栏不变。重定向:浏览器URL的地址栏改变;
3、转发是服务器行为,重定向是客户端行为;
4、转发是浏览器只做了一次访问请求。重定向是浏览器做了至少两次的访问请求;
5、转发2次之间传输的信息不会丢失,重定向2次跳转之间传输的信息会丢失(request范围)。
13、@Resource和@Autowired异同
14、依赖注入的方式有几种
一、构造器注入
将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。
优点:
对象初始化完成后便可获得可使用的对象。
缺点:
当需要注入的对象很多时,构造器参数列表将会很长;
不够灵活。若有多种注入方式,每种方式只需注入指定几个依赖,那么就需要提供多个重载的构造函
数,麻烦。
二、setter方法注入
IoC Service Provider通过调用成员变量提供的setter函数将被依赖对象注入给依赖类。
优点:
灵活。可以选择性地注入需要的对象。
缺点:
依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用。
三、接口注入
依赖类必须要实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参
数就是要注入的对象。
优点
接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可。
缺点:
侵入行太强,不建议使用。
PS:什么是侵入行?
如果类A要使用别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是
侵入性。
15、Spring框架中都用到了哪些设计模式?
(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式:Bean默认为单例模式。
(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
(5)观察者模式:定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它
的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。
16、解释一下spring bean的生命周期

首先说一下Servlet的生命周期:实例化,初始init,销毁destroy;
Spring上下文中的Bean生命周期也类似,如下:
(1)实例化Bean:
对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。对于ApplicationContext容器,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean。
(2)设置对象属性(依赖注入):
实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成依赖注入。
(3)处理Aware接口:
接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean:
①如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的就是Spring配置文件中Bean的id值;
②如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身。
③如果这个Bean已经实现了ApplicationContextAware接口,会调用
setApplicationContext(ApplicationContext)方法,传入Spring上下文;
(4)BeanPostProcessor:
如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。
(5)InitializingBean 与 init-method:
如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。
(6)如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;
以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。
(7)DisposableBean:
当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;
(8)destroy-method:
最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
17. ApplicationContext 的实现类有哪些?
FileSystemXmlApplicationContext :此容器从一个XML 文件中加载beans 的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。
ClassPathXmlApplicationContext:此容器也从一个XML 文件中加载beans 的定义,这里,你需要正确设置
classpath 因为这个容器将在classpath 里找bean 配置。
WebXmlApplicationContext:此容器加载一个XML 文件,此文件定义了一个WEB 应用的所有bean。
18、Spring有几种配置方式?
将Spri ng配置到应用开发中有以下三种方式:
基于XML的配置
Spr ing的XML配置方式是使用被Spr ing命名空间的所支持的一系列的 XML标签来实现的。Spring有以下主要的命名空间:context、beans、 jdbc、tx、aop、mvc基于注解的配置
<beans>
<context:annotation-config/>
<!-- bean definitions go here --> </beans>
@Required
@Autowired
@Qualifier
JSR-250 Anno tatio ns:Spri ng 支持基于 JSR-250 注解的以下注解, @Resource、@PostC on struct 和 @PreDestroy。
- 基于Java的配置
Java配置的支持是由@Configuration注解和@Bean注解来实现 的
@Configuration
public class AppConfig{
@Bean
public MyService myServiceO {
return new MyServicelmpl();
}
}
19、BeanFactory 与AppliacationContext 有什么区别
- BeanFactory
基础类型的IOC 容器,提供完成的IOC 服务支持。如果没有特殊指定,默认采用延迟初始化策略。相对来说,容器启动初期速度较快,所需资源有限。
BeanFactory 简单粗暴,可以理解为就是个 HashMap,Key 是 BeanName,Value 是 Bean 实例。通常只提供注册(put),获取(get)这两个功能。我们可以称之为 “低级容器”。
2.ApplicationContext
ApplicationContext 是在BeanFactory 的基础上构建,是相对比较高级的容器实现,除了BeanFactory 的所有支持外,ApplicationContext 还提供了事件发布、国际化支持、统一的资源文件读取方式等功能。ApplicationContext 管理的对象,在容器启动后默认全部初始化并且绑定完成。
ApplicationContext 可以称之为 “高级容器”。因为他比 BeanFactory 多了更多的功能。他继承了多个接口。因此具备了更多的功能。支持不同信息源头,支持 BeanFactory 工具类,支持层级容器,支持访问文件资源,支持事件发布通知,支持接口回调等等。,对 BeanFactory 多了工具级别的支持等待。所以你看他的名字,已经不是 BeanFactory 之类的工厂了,而是 “应用上下文”, 代表着整个大容器的所有功能。该接口定义了一个 refresh 方法,此方法是所有阅读 Spring 源码的人的最熟悉的方法,用于刷新整个容器,即重新加载/刷新所有的 bean。

最上面的是 BeanFactory,下面的 3 个绿色的,都是功能扩展接口,这里就不展开讲。
看下面的隶属 ApplicationContext 粉红色的 “高级容器”,依赖着 “低级容器”,这里说的是依赖,不是继承哦。他依赖着 “低级容器” 的 getBean 功能。而高级容器有更多的功能:支持不同的信息源头,可以访问文件资源,支持应用事件(Observer 模式)。
通常用户看到的就是 “高级容器”。 但 BeanFactory 也非常够用啦!
左边灰色区域的是 “低级容器”, 只负载加载 Bean,获取 Bean。容器其他的高级功能是没有的。例如上图画的 refresh 刷新 Bean 工厂所有配置,生命周期事件回调等。
20、什么是Spring beans? 一个 Spring Beans 的定义需要包含什么?
Spring beans 是那些形成Spring 应用的主干的java 对象。它们被Spring IOC 容器初始化,装配,和管理。这些beans 通过容器中配置的元数据创建。比如,以XML 文件中 的形式定义。
Spring 框架定义的beans 都是单例beans。
一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。
21、Spring 框架中的单例bean 是线程安全的吗?
Spring 框架中的单例bean 不是线程安全的。
Spri ng框架并没有对单例bea n进行任何多线程的封装处理。关于单例 bea n的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分 的Spring bean并没有可变的状态(比如Servie类和DAO类),所以在某 种程度上说Spri ng的单例bean是线程安全的。如果你的bean有多种状 态的话(比如View Model对象),就需要自行保证线程安全。
最浅显的解决办法就是将多态bean的作用域由"singleton”变更 为"prototype”。
22、什么是Spring 的内部bean?
当一个bean 仅被用作另一个bean 的属性时,它能被声明为一个内部bean,为了定义inner bean,在
Spring 的 基于XML 的 配置元数据中,可以在 或 元素内使用 元素,内部bean 通常是匿名的,它们的Scope 一般是prototype。
比如,在我们的应用程序中,一个Customer类引用了一个Person类, 我们的要做的是创建一个Person的实例,然后在Customer内部使用。
public class Customer{
private Person person;
//Setters and Getters
}
public class Person{
private String name;
private String address;
private int age;
//Setters and Getters
}
内部bean的声明方式如下:
<bean id="CustomerBean" class="com.somnus.common.Customer"> <property name="person">
<!-- This is inner bean -->
<bean class="com.howtodoinjava.common.Person">
<property name="name" value="lokesh" />
<property name="address" value="India" />
<property name="age" value="34" />
</bean>
</property>
</bean>
23. 在 Spring 中如何注入一个java 集合?
Spring 提供以下几种集合的配置元素:
类型用于注入一列值,允许有相同的值。
类型用于注入一组值,不允许有相同的值。
<beans>
<!-- Definition for javaCollection -->
<bean id="javaCollection" class="com.howtodoinjava.JavaCollect ion">
<!-- java.util.List -->
<property name="customList">
<list>
<value>INDIA</value>
<value>Pakistan</value>
<value>USA</value> <value>UK</value>
</list>
</property>
<!-- java.util.Set -->
<property name="customSet">
<value>INDIA</value>
<value>Pakistan</value>
<value>USA</value>
<value>UK</value>
</set>
</property>
<!-- java.util.Map -->
<property name="customMap">
<map>
<entry key="1" value="INDIA"/>
<entry key="2" value="Pakistan"/>
<entry key="3" value="USA"/>
<entry key="4" value="UK"/>
</map>
</property>
<!-- java.util.Properties -->
<property name="customProperies">
<props>
<prop key="admin">admin@nospam.com</prop>
<prop key="support">support@nospam.com</prop>
</props>
</property>
</bean>
</beans>
24、如何向 Spring Bean 中注入一个 Java.util.Properties?
第一种方法是使用如下面代码所示的<props>标签:
<bean id="adminUser" class="com.somnus.common.Customer">
<!-- java.util.Properties -->
<property name="emails">
<props>
<prop key="admin">admin@nospam.com</prop>
<prop key="support">support@nospam.com</prop> </props>
</property>
</bean>
也可用"util:"命名空间来从properties文件中创建出一个propertiesbean, 然后利用setter方法注入bean的引用。
25、解释不同方式的自动装配 。
有五种自动装配的方式,可以用来指导Spring 容器用自动装配方式来进行依赖注入。
1)no:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。
2)byName:通过参数名自动装配,Spring 容器在配置文件中发现bean 的autowire 属性被设置成byname,之后容器试图匹配、装配和该bean 的属性具有相同名字的bean。
3)byType::通过参数类型自动装配,Spring 容器在配置文件中发现bean 的autowire 属性被设置成byType,之后容器试图匹配、装配和该bean 的属性具有相同类型的bean。如果有多个bean 符合条件,则抛出错误。
4)constructor:这个方式类似于byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
5)autodetect:首先尝试使用constructor 来自动装配,如果无法工作,则使用byType 方式。
26、在Spring 框架中如何更有效地使用JDBC?
使用SpringJDBC 框架,资源管理和错误处理的代价都会被减轻。所以开发者只需写statements 和 queries 从数据存取数据,JDBC 也可以在Spring 框架提供的模板类的帮助下更有效地被使用,这个模板叫JdbcTemplate 。
JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处理。
27、使用Spring 通过什么方式访问Hibernate?
在Spring 中有两种方式访问Hibernate:
1)控制反转 HibernateTemplate 和 Callback。
2)继承 HibernateDAOSupport 提供一个AOP 拦截器。
28、Spring框架中有哪些不同类型的事件?
Spring的ApplicationContext提供了支持事件和代码中监听器的功能。 我们可以创建bean用来监听在Applicatio nCo ntext中发布的事件。 Applicatio nEve nt类和在Applicatio nCon text接口中处理的事件,如果一个 bean 实现了 Applicatio nListe ner 接口,当一个 Applicatio nEve nt 被发布以 后,bean会自动被通知。
public class AllApplicationEventListener implements Applicatio nListener < ApplicationEvent >{
@Override
public void onApplicationEvent(ApplicationEvent applicatio nEvent){
//process event
}
}
Spri ng提供了以下5中标准的事件:
- 上下文更新事件(Co ntextRefreshedEve nt):该事件会在 Applicatio nCo ntext 被初始化或者更新时发布。也可以在调用Con figurableApplicatio nCo ntext 接口中的refresh。方法时被触发。
- 上下文开始事件(Con textStartedEve nt):当容器调用
Con figurableApplicatio nCo ntext的Start。方法开始/重新开始容器时触发该 事件。 - 上下文停止事件(Con textStoppedEve nt):当容器调用
Co nfigurableApplicatio nCon text的Stop。方法停止容器时触发该事件。 - 上下文关闭事件(Co ntextClosedEveint):当 Applicatio nCon text 被关闭时触 发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
- 请求处理事件(RequestHa ndledEve nt):在Web应用中,当一个http请求 (request)结束触发该事件。
除了上面介绍的事件以外,还可以通过扩展Applicatio nEve nt类来开发自 定义的事件。
public class CustomApplicationEvent extends ApplicationEvent{
public CustomApplicationEvent ( Object source, final String ms g ){
super(source);
System.out.println("Created a Custom event");
}
}
为了监听这个事件,还需要创建一个监听器:
public class CustomEventListener implements ApplicationListene r <CustomApplicationEvent >{
@Override
public void onApplicationEvent(CustomApplicationEvent applicationEvent) {
//handle event
}
}
之后通过applicatio nCon text接口的publishEve nt()方法来发布自定义事 件。
CustomApplicationEvent customEvent = new
CustomApplicationEvent(applicationContext, "Test message"); applicationContext.publishEvent(customEvent);
29、FileSystemResource 和 ClassPathResource 有何区别?
在FileSystemResource中需要给出spri ng-co nfig.xml文件在你项目中的相 对路径或者绝对路径。在ClassPathResource中spring会在ClassPath中 自动搜寻配置文件,所以要ClassPathResource文件放在ClassPath 下。
如果将spr in g-co nfig.xm l保存在了 src文件夹下的话,只需给出配置文件 的名称即可,因为src文件夹是默认。
简而言之,ClassPathResource在环境变量中读取配置文件, FileSystemResource在配置文件中读取配置文件。