Spring学习6(1)
学习5中主要学习的是Ioc的容器的整体概念,这里(即是书中第5章)主要开始对Bean的配置进行学习。
Spring配置概述
Spring容器高层视图
要使应用程序中的Spring容器成功启动,需要同时具备以下三方面条件:
- Spring 框架的类包都已经放到应用程序的类路径下
- 应用程序为spring提供了完备的Bean配置信息
- Bean的类都已经放到应用程序的类路径下
具体关系与过程如下图所示:
Bean配置信息是Bean的元数据信息,其由下列四个方面组成:
- Bean的实现类
- Bean的属性信息:如用户名,密码等
- Bean的依赖关系
- Bean的行为配置:如生命周期范围及各个过程的回调函数
基于XML的配置
spring2.0后xml使用Schema格式,让不同类型的配置拥有了自己的命名空间,使配置文件更具扩展性和简易性。
<?xml version="1.0" encoding="UTF-8" ?>
<beans
<!-- 默认命名空间 -->
xmlns="http://www.springframework.org/schema/beans"
<!-- xsi标准命名空间,用于指定自定义命名空间的Schema文件-->
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!-- aop为自定义命名空间名称的简称,后面的url是命名空间的全称,指定具体Schema文件 -->
xmlns:aop="http://www.springframework.org/schema/aop"
<!-- 为每个命名空间指定具体Schema文件 -->
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<!-- 默认命名空间的配置 -->
<bean id="foo" class="com.smart.Foo"/>
<!-- aop命名空间的配置 -->
<aop:config>
<aop:advisor pointcut="execution(* *..PetStoreFacade.*(..))"
advice-ref="texAdvice"/>
</aop:config>
</beans>
在上面的代码用xmlns的方式对文档所引用的命名空间进行申明,上述代码定义了三个命名空间:
- 默认命名空间,没有空间名,用于Spring Bean的定义
- xsi标准命名空间,用于为每个文档中的命名空间指定相应的Schema样式文件。
- aop命名空间,是spring配置Aop的命名空间,即是一种自定义的命名空间。
命名空间的定义
命名空间的定义分为两个步骤:
- 指定命名空间的名称
- 指定命名空间的schema文档格式文件的位置,用空格或回车换行进行分隔。
在第一步中需要指定命名空间的缩略名和全名,如上述代码中定义的:
xmlns:aop="http://www.springframework.org/shema/aop"
。aop为命名空间的别名,文档后面的元素可以通过命名空间名加以区别,如<aop:config>
等。
如果命名空间的别名为空,则是默认命名空间,如<beans/>
,<bean/>
等。
Bean基本配置
在Spring容器的配置文件中定义一个简要的Bean配置片段如下:
<bean id="Bean的名称" class="Bean的类名"/>
容器可以直接根据id的名字利用getBean(id)的方法得到所需的Bean。它是在容器中起到定位查找的作用,在外部程序中是和spring Ioc容器进行交互的桥梁。
一般情况下,我们需要为一个Bean指定一个id属性作为Bean的名称,id在IoC容器中必须是唯一的,而且id的命名需要满足XML对id的命名规范,必须以字母开始,以完整结束符号结束。
在实际情况下,用户可以使用name的属性来提供BeanName,一个bean可以有多个id,多个name,可以用逗号,分号或者空格进行分隔,如:
<bean name="#car1, 123, $car"...>
但是在获取Bean的时候如果有两个相同neam时,会采用后定义的bean。
如果id和name两个属性都没有指定,那么会将Bean的类名作为id,多个实现类相同的匿名bean如下所示时:
<bean class="class.smart.simple.Car"/>
<bean class="class.smart.simple.Car"/>
<bean class="class.smart.simple.Car"/>
其id就分别设为:
com.smart.simple.Car
com.smart.simple.Car#1
com.smart.simple.Car#2
后续若还有更多匿名类则以此类推。