spring实战学习之装配bean

依赖注入:让各个模块保持松散耦合

AOP面向切面编程:各个组件负责特定核心功能,不需要考虑事务,日志,安全等系统服务功能,AOP将这些每个模块都需要考虑的服务模块化,并以声明的方式将它们应用到它们需要影响的组件模块中去,使得各个业务模块更多关注自身业务,无需了解系统服务功能。使POJO保持简单。

一.spring装配bean之基于xml文件配置的方式

创建应用对象之间的协作关系的行为通常被称为装配。spring容器提供了两种配置bean的方式:xml文件配置方式,基于java注解的配置方式。

1.1创建spring的配置,如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--bean declaratuion go here   在<beans>元素内,放置所有Spring的配置 -->
</beans>

1.2声明简单的bean:可以通过构造器方法和工厂方法创建bean。

构造器方法:spring容器加载bean时,调用默认的构造器实例化。

<bean id="demoBean"   class="com.demo.client.DemoBean" />

构造器方法:声明指定构造方法通过构造器注入参数的值。通过<constructor-arg>元素来告诉spring额外的信息。

<bean id="demoBean"   class="com.demo.client.DemoBean" >
    <constructor-arg value="param的值" />
    <constructor-arg ref="param为具体某个自定义类型,即某个声明的bean的id" />
</bean>

举个例子:

<bean id="demoBean"   class="com.demo.client.DemoBean" >
    <constructor-arg value="10" />
    <constructor-arg ref="demoId" />
</bean>
<bean id="demoId"   class="com.demo.client.DemoParam" />

注意:对于非简单类型,比如自定义类型,spring使用ref属性来将指定Id的Bean引用传递给构造器。

工厂方法:针对于无公开构造方法的bean

<bean id="demoId"   
            class="com.demo.client.DemoParam" 
            factory-method="类的静态方法" />

1.3 bean的作用域

<bean id="demoId"   
            class="com.demo.client.DemoParam" scope="prototype" />

singleton

在每一个Springle容器中,一个bean定义只有一个对象实例(默认)  

prototype

允许bean的定义可以被实例化任意次(每次调用都创建一个实例)

request

在一次Http请求中,每个bean定义对应一个实例,该作用域仅在基于web的spring上下文中才有效

session

在一个Http Session请求中,每个bean定义对应一个实例,该作用域仅在基于web的spring上下文中才有效

global-session

在一个全局Http Session请求中,每个bean定义对应一个实例,该作用域仅在portlet上下文中才有效

1.4 初始化和销毁bean

<bean id="demoId"   
            class="com.demo.client.DemoParam" scope="prototype"
            init-method="Bean实例化后立即调用初始化指定的方法"
            destory-method="Bean从容器中移除和销毁前,调用的方法"/>

此外,还有默认的init-method和destory-method。比如在上下文定义中有很多Bean都拥有相同名字的初始化方法和销毁方法。此时没有必要为每一个bean声明init-method和destory-method。可以使用<beans>元素的default-init-method和default-destory-method属性。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans.xsd">
default-init-method=“Bean实例化后立即调用初始化指定的方法”
default-destory-method=“Bean从容器中移除和销毁前,调用的方法”
</beans>

default-init-method和default-destory-method属性分别为应用上下文中所有bean设置了共同的初始化方法和销毁方法。

1.5注入bean属性

使用<property>元素配置Bean属性,通过setter方法注入值。与<constructor-arg>类似,只是<constructor-arg>通过构造参数注入值。

<bean id="demoId"   
            class="com.demo.client.DemoParam" scope="prototype" 
           <property name = "key" value="the key value">
            <property name = "demoParam (DemoParam类型的属性名,比如这里是demoParam)" ref="demoId">
</bean>

使用spring命名空间p装配属性。在spring的xml配置中增加声明:xmlns:p="http://www.springframework.org/schema/p"

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
<bean id="demoId"   
            class="com.demo.client.DemoParam" scope="prototype" 
           p : key="the key value"
             p : demoParam-ref = "the key value" />

-ref后缀作为一个标识来告知spring应该装配一个引用而不是字面值。

使用表达式装配SpEL

它通过运行期执行的表达式将值装配到bean的属性或者构造参数中。在<property>元素中的value属性中使用#{}界定符把这个值装配到bean的属性值。

 

1.6装配集合

spring提供了4种类型的集合配置元素。

<list>

装配list类型的值,可重复

<set>

装配set类型的值,不可重复

<map>

装配map类型的值,名称和值可以为任意类型

<props>

装配properties类型的值,名称和值必须是string类型

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章