上一篇学习了 IoC 的概念并初步分析了实现原理, 这篇主要学习 spring 的配置, 话不多说, 让我们开始!
一, Bean 元素配置
1.1 基本配置
看一个最基本的 bean 配置
<bean name="hello" class="com.yuanqinnan.test.HelloWorld"></bean>
上面的配置中, 我们将 bean 交给 spring 管理, 看其中属性字段:
class: 被管理对象的完整类名
name: 被管理对象的名称, 可以通过名称获取改对象 (可以重复, 可以使用特殊字符)
id: 与 name 作用相同 (不可以重复, 不可以使用特殊字符)
1.2 bean 的进阶配置
scope 属性
singleton: 定义 bean 的范围为每个 Spring 容器一个实例 (默认值)
prototype: 定义 bean 可以被多次实例化 (使用一次就创建一次)
request: 定义 bean 的范围是 HTTP 请求, 只有再使用有 web 能力的 spring 上下文时有效.
request: 定义 bean 的范围是 HTTP 请求, 只有再使用有 Web 能力的 spring 上下文时有效.
global-session: 定义 bean 的范围是全局 HTTP 会话, 只有再 portlet 上下文中有效.
生命周期属性
init-method: 配置一个方法作为生命周期初始化方法. spring 会在对象创建之后立即调用.
destory-method: 配置一个方法作为生命周期的销毁方法. spring 容器在关闭并销毁所有容器中的对象之前调用.
代码如下
- <bean id="hello" init-method="getInfo" destroy-method="destory" class="com.yuanqinnan.test.HelloWorld">
- </bean>
注意, 只有 singleton 的 bean,destory-method 才有效
1.3 实例化 bean 的方式
使用类构造器实例化 (默认无参数)
- <bean id="hello" class="com.yuanqinnan.test.HelloWorld">
- </bean>
使用静态工厂方法实例化 (简单工厂模式)
- public class HellowWorldFactory {
- public static HelloWorld createHellowWorld(){
- return new HelloWorld();
- }
- }
- <bean name="hello2"
- class="com.yuanqinnan.test.HellowWorldFactory"
- factory-method="createHellowWorld">
- </bean>
使用实例工厂方法实例化 (工厂方法模式)
- public class HellowWorldFactory2 {
- public HelloWorld createHellowWorld(){
- return new HelloWorld();
- }
- }
- <bean id="HellowWorldFactory2" class="com.yuanqinnan.test.HellowWorldFactory2"/>
- <bean id="hello3" factory-bean="HellowWorldFactory2" factory-method="createHellowWorld" />
1.4 spring 的分模块配置
spring 允许多个文件进行配置, 可以按照模块来进行配置
<import resource="applicationContext2.xml"></import>
二, spring 属性注入
2.1 set 方法注入
- <bean > 元素的 < property > 子元素指明了使用它们的 set 方法来注入, 可以使用 property 的 value 属性来注入简单类型
- <bean name="user" class="com.yuanqinnan.test.User">
- <!-- 值类型注入 -->
- <property name="age" value="18"></property>
- <property name="name" value="tom"></property>
- <!-- 引用类型注入 -->
- <property name="car" ref="car"></property>
- </bean>
- <bean name="car" class="com.yuanqinnan.test.Car">
- <property name="color" value="blue"></property>
- </bean>
User 类与 Car 类代码就不贴了, 应该是可以看得懂.
2.2 构造函数注入
使用 constructor-arg 来完成构造方法的注入, 注入的方式和 setter 方式注入相同. 可以通过 type 属性, 控制注入的类型 可以通过 index 属性, 控制注入的顺序 可以通过 name 属性, 控制注入的名字
- <bean name="user2" class="com.yuanqinnan.test.User">
- <constructor-arg name="name" index="0" type="java.lang.String" value="lucy"></constructor-arg>
- <constructor-arg name="age" index="1" type="java.lang.Integer" value="20"></constructor-arg>
- <constructor-arg name="car" ref="car"></constructor-arg>
- </bean>
2.3 spel 注入
- <bean name="user3" class="com.yuanqinnan.test.User">
- <property name="name" value="#{user.name}"></property>
- <property name="age" value="#{user2.age}"></property>
- <!-- 引用类型注入 为 car 属性注入下方配置的 car 对象 -->
- <property name="car" ref="car"></property>
- </bean>
三, 复杂类型注入
3.1 数组
- <property name="arr">
- <array>
- <value>tom</value>
- <value>lucy</value>
- <ref bean="user2"></ref>
- </array>
- </property>
- 3.2 List
- <property name="list">
- <list>
- <value>tom</value>
- <value>lucy</value>
- <ref bean="user2"></ref>
- </list>
- </property>
- 3.3 Set
- <property name="set">
- <set>
- <value>com.jbdc.MySQL.Driver</value>
- <value>root</value>
- <ref bean="user"/>
- </set>
- </property>
- 3.4 Map
- <property name="map">
- <map>
- <entry key="url" value=""></entry>
- <entry key="user" value-ref="user"></entry>
- <entry key-ref="user3" value-ref="user2"></entry>
- </map>
- </property>
- 3.5 Properties
- <property name="prop">
- <props>
- <prop key="url">com.jbdc.MySQL.Driver</prop>
- <prop key="userName">root</prop>
- <prop key="password">1234</prop>
- </props>
- </property>
总结: 以上是 spring 的配置详解, 都是通过 xml 装配, 下一篇我们学习注解配置
来源: https://www.cnblogs.com/yuanqinnan/p/10312037.html