4 V0 t9 b) R) e: _Spring配置文件是个XML 文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。- B, H F) G x% X. I+ Y( m
0 i, \3 j! o5 u6 L- u D o
13. 什么是Spring IOC 容器?: T! ?) R. @7 Y* |0 i* V+ A% P
G- g$ x G) i, n5 b
Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。+ |5 F, M( q5 z6 z, H8 y1 z
: H" k% e7 c0 N9 H% e& Y14. IOC的优点是什么?4 J, O! m+ o; l' P
- ~- |1 M' I# J- ^6 k; |IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。 & Y) I* h4 x3 ?9 W% Y6 O5 m, M6 o, l& b6 a# K4 V" P
15. ApplicationContext通常的实现是什么?6 {4 k$ f# z. x0 d7 Y
6 ]0 X, w. y+ o. k, A
FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。- n. U# U E& L' f
ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。' }3 s0 S& ?0 O2 ?) i! s$ P
WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。% i+ R) ^2 ^, J7 w
16. Bean 工厂和 Application contexts 有什么区别? 0 B" l7 }0 m* j: ?$ B8 f , M2 H: }& n4 t4 BApplication contexts提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜像),它们可以向注册为监听器的bean发布事件。另外,在容器或容器内的对象上执行的那些不得不由bean工厂以程序化方式处理的操作,可以在Application contexts中以声明的方式处理。Application contexts实现了MessageSource接口,该接口的实现以可插拔的方式提供获取本地化消息的方法。5 \+ i- J, R) | d1 t
- T& t* T6 q0 l3 X& ~8 j
17. 一个Spring的应用看起来象什么? . p1 J+ F9 Q0 d1 e % M5 ~# R7 l' d/ o( N0 e% p一个定义了一些功能的接口。 7 H& j D, }% a8 r5 ?6 S% q这实现包括属性,它的Setter , getter 方法和函数等。: k0 O' ~/ j8 T% ?' U9 y' m
Spring AOP。% W+ @* w6 ^( e9 d
Spring 的XML 配置文件。 9 O3 Y& k( L2 r, j, i% C* F! i使用以上功能的客户端程序。% l( j$ c& X! ~) R$ ^, M" y
依赖注入1 q+ _% e3 G+ Z& Y. K1 \
18. 什么是Spring的依赖注入?% H+ j$ M, D1 L) |: C3 b
. u8 y9 L- H% V) G/ x当定义一个<bean> 在Spring里,我们还能给这个bean声明一个作用域。它可以通过bean 定义中的scope属性来定义。如,当Spring要在需要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。另一方面,一个bean每次使用的时候必须返回同一个实例,这个bean的scope 属性 必须设为 singleton。 : H5 x+ M* T4 l' q" O9 f' f1 Z# o/ U( A! v
25. 解释Spring支持的几种bean的作用域。 9 Y3 n' K# R! `% z. U0 N 3 G' `$ f8 Q5 K9 `# ^# O# g! S% OSpring框架支持以下五种bean的作用域:2 O. h- i/ e- g2 M% g( x
, V5 c: _' S- o. Q8 g) _& H8 g8 lsingleton : bean在每个Spring ioc 容器中只有一个实例。 r+ d5 J* [& ]5 }prototype:一个bean的定义可以有多个实例。 n8 ?" D- g q/ R u& ^8 o- n( v
request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。 2 V: r* Y G. w8 ~/ D# C& ^session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。 4 P2 _6 d3 x6 X) U6 F% mglobal-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。 / K. O1 g, h- \缺省的Spring bean 的作用域是Singleton. 5 \+ }9 a! i6 q- z# s" v3 F* b; V, n- X. O. u
26. Spring框架中的单例bean是线程安全的吗? 3 D; A, m) Z5 s5 [( e/ c7 z, r' d1 q9 |, v; p
不,Spring框架中的单例bean不是线程安全的。5 K. j* b; Z+ }5 Q$ @* ]; M8 J
5 [+ N' p" g; A8 J
27. 解释Spring框架中bean的生命周期。 0 \. a1 m o; J! {0 J+ q# {+ G0 _3 J3 z+ {. z
Spring容器 从XML 文件中读取bean的定义,并实例化bean。+ s7 o3 i- R8 @# \7 B$ q- ?% G( f a
Spring根据bean的定义填充所有的属性。 8 y/ p6 ~3 Z+ R6 b+ P* J; N如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。 # z/ p; {% d' _! p9 y如果Bean 实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory 方法。( j$ A' l3 E! }1 T: L! Z
如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。( P ^( i2 h I7 b' Y9 | d
如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。/ S( E1 b o5 r' \8 a! F
如果有BeanPostProcessors 和bean 关联,这些bean的postProcessAfterInitialization() 方法将被调用。( c& ~* q1 ?1 u' d) U) ?# ^! }; s
如果bean实现了 DisposableBean,它将调用destroy()方法。. ~# o0 H0 ` U" D4 n
28. 哪些是重要的bean生命周期方法? 你能重载它们吗?3 W) X( m" U0 M6 z3 M5 d- E W! ?
' x+ |- j6 d6 x有两个重要的bean 生命周期方法,第一个是setup , 它是在容器加载bean的时候被调用。第二个方法是 teardown 它是在容器卸载类的时候被调用。 ! o, n4 S Z" s$ H6 k3 ] / K1 f$ C5 Z! @& MThe bean 标签有两个重要的属性(init-method和destroy-method)。用它们你可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)。$ z6 @$ T; ]/ a) }, y/ A8 L
0 L, ~ b, ^# N
29. 什么是Spring的内部bean? ' Y' t. a4 o- G; k: ?2 V 5 k: R Q2 T* Q+ t4 Q当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring 的 基于XML的 配置元数据中,可以在 <property/>或 <constructor-arg/> 元素内使用<bean/> 元素,内部bean通常是匿名的,它们的Scope一般是prototype。; H/ q# g( P6 I; V9 v3 i4 c, U
5 b0 d3 `8 j4 Z# R( Y4 Q+ B4 t
30. 在 Spring中如何注入一个java集合? 2 Q: x A' ] H" ^: s8 B3 t' u" C+ ]5 Y0 T8 ?
Spring提供以下几种集合的配置元素:7 M/ K h Y4 R
* K; ^$ p: ?4 C3 s8 e4 l F) F, P! P
<list>类型用于注入一列值,允许有相同的值。: m( P1 U9 k6 B
<set> 类型用于注入一组值,不允许有相同的值。+ o- w B, _7 \; w ?: d' j( I. ~
<map> 类型用于注入一组键值对,键和值都可以为任意类型。 - \) k: E4 Y# c) H( O/ f9 S+ R3 j<props>类型用于注入一组键值对,键和值都只能为String类型。/ P3 o# L" b" W, N0 a; P5 x6 M' K
31. 什么是bean装配?9 X$ H' W! d* V$ H/ |
) ] Y+ V& y% k$ \$ Z
装配,或bean 装配是指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。 1 l" d$ ]8 g! v9 z$ w 4 v5 h0 e6 |5 i/ N4 ^/ ~ G32. 什么是bean的自动装配? + F/ E c, L: C6 M: v; b' b# _- O# b
Spring 容器能够自动装配相互合作的bean,这意味着容器不需要<constructor-arg>和<property>配置,能通过Bean工厂自动处理bean之间的协作。 ) L4 l. V9 e# i/ v! v : R) C% u1 R) w! E6 B- M8 j33. 解释不同方式的自动装配 。2 S8 q3 h. D+ y- a% z( ~% V, }4 c
. G/ Z9 c f6 I1 Z7 k& u9 g+ v0 ^
有五种自动装配的方式,可以用来指导Spring容器用自动装配方式来进行依赖注入。 $ d' f& r( q. l3 Y$ \; {' R# I: n% p7 I, Z; [7 k' N0 i
no:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。 ( h/ K, d+ U& ?, ]! ?/ ~byName:通过参数名 自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。 7 e0 Y1 b3 I7 XbyType::通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。 9 [3 p' I2 A2 o5 Y. `# Tconstructor:这个方式类似于byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。 ) r- G, @ ?5 |7 s! v: ?autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。& R# R# L( I# c* t% O+ X& J
34.自动装配有哪些局限性 ? d9 i- d$ F' m3 W9 f" ^' \8 W L & Q; `* X& r& O1 e自动装配的局限性是:" I8 t# z3 P; m
. S2 O5 E% Z' P6 e; R
重写: 你仍需用 <constructor-arg>和 <property> 配置来定义依赖,意味着总要重写自动装配。. V8 o2 s! j$ k& V% b5 W7 f7 }
基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。+ A! L+ G- t" M0 ~
模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。 % l* X5 a1 w& R5 [# A4 Y8 T( e35. 你可以在Spring中注入一个null 和一个空字符串吗?) Y, O/ E7 U/ a/ K, ]2 K
N' b+ Q, F9 z8 `% C: D可以。 ( a, m, _5 o1 ]1 Y6 I' @ 6 b" P' U+ b6 l( m. d( b' O7 K+ JSpring注解 : i& X C' |7 t; p$ M' Q36. 什么是基于Java的Spring注解配置? 给一些注解的例子.; C" \8 V+ e8 O: ]: [" i/ w# R