1,Spring容器原理概述
Bean配置信息定义了Bean的实现以及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载、实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean的缓存池中,以供外层的应用程序调用。
2 ,Spring的依赖注入
1) 属性注入,例子:
<propertyname=”attributeName”><value>value</value></property>
2) 构造函数注入,例子:
<constructor-argtype=”double”><value>value</value></ constructor>
3) 工厂方法注入,例子:
<beanid=”carFactory” class=”mvn.CarFactory”>
<beanid=”car2” factory-bean=”carFactory”factory-method=”createHongQiCar”>
3 ,Bean的引用
<ref>元素可以通过以下三个属性引用容器中其他的Bean。
1) bean:通过该属性可以引用同一容器或者父容器的Bean,这是最常见的形式
2) local:通过该属性只能引用统一配置文件中的Bean,它可以利用XML解析器自动检验引用的合法性,以便在开发编写配置时就能够及时发现并纠正配置的错误。
3) parent:引用父容器中的Bean,如<ref parent=”car”>的配置说明car的Bean是父容器的Bean
4 ,Bean的作用域
类别 | 说明 |
singleton | 在Spring 的IOC容器中仅存一个Bean实例,Bean以单实例的方式存在 |
prototype | 每次从容器中调用调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new XXBean()的操作 |
request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 |
session | 同一个HTTP Session共享一个Bean,不同HTTP Session使用不同的Bean,该作用域仅适用于WebApplicationContext环境 |
globalSession | 同一个全局Session共享一个Bean,一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext |
5,Spring的一些小知识
1) Spring配置文件不允许出现两个相同id的<bean>,但却可以出现两个相同name的<bean>,如果多个name相同的<bean>通过getBean获取Bean时,将返回后面声明的那个Bean,原因是后面声明的Bean覆盖了前面的同名Bean。
2) 如果一个Bean的id和name都未指定,Spring将自动将全限定类名作为Bean的名称。
3) 当两个Bean存在循环依赖的问题时,可以通过修改Bean的代码,将构造函数注入的方式调整为属性注入的方式就行了。
4) Spring的XML属性注入时,设置null值一定要用<null/>标签。
5) 在Spring环境下,对于所有的Dao类都可以采用单实例模式,因为Spring利用AOP和LocalThread的功能,对非线程安全的变量进行了特殊的处理,使这些非线程安全的类变成了线程安全的类。
6) 当一个request作用域的car Bean被一个singleton作用域的boss Bean引用时,为了让boss能够从适当作用域中获取的car Bean的引用,需要使用Spring AOP的语法为car Bean配置一个代理类。
7) Java语言智能对接口提供自动代理,如果需要对类进行动态代理,就需要使用CGLib为类生成动态代理的子类。