依赖注入:让各个模块保持松散耦合
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类型 |