1.三种实例化Bean的方式
- 使用类构造器实例化(默认无参数)
- 使用静态工厂方式实例化(简单工厂模式)
- 使用实例工厂方式实例化(工厂方法模式)
2.Bean的常用配置
-
id和name
1.一般情况下,装配一个Bean时,通过指定一个id属性作为Bean的名称
2.id属性在IOC容器中必须是唯一的
3.如果Bean的名称中含有特殊字符,就需要使用name属性 -
class
用来设置一个类的完全路径名称,主要作用是 IOC容器生成类的实例 -
scope
指定Bean的作用域 -
init-method
指定Bean初始化时的方法 -
destory-method
指定Bean销毁时的方法,scope=singleton(单例模式)时有效
3.Bean的作用域(由scope属性来指定)
-
singleton(默认值)
在SpringIOC容器中仅存在一个Bean实例,Bean以单例的方式存在 -
prototype
每次调用getBean()时都会返回一个新的实例(一般在整合Struts的时候,需要把action配置成多例模式) -
request
每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 -
session
同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean。该作用域仅适用于WebApplicationContext环境
4.Bean的生命周期
Spring初始化Bean或销毁Bean的时候,有时需要做一些处理工作,因此Spring可以在创建或销毁Bean时调用Bean的两个生命周期方法
<bean id="xxx" class="......" init-method="init" destory-method="destory">
当bean被载入到容器的时候调用init;
当bean从容器中删除的时候调用destory(scope=singleton时有效)
1.instantiate bean对象实例化
2.populate properties封装属性
3.如果Bean实现BeanNameAware执行setBeanName
4.如果Bean实现BeanFactoryAware或者ApplicationContextAware设置工厂setBeanFactory或者上下文对象setApplicationContext
5.如果存在类实现BeanPostProcessor(后处理Bean),执行postProcessBeforeInitialization,可以对我们的类进行增强
6.如果Bean实现InitializingBean执行afterPropertiesSet
7.调用<bean init-method=“init”>指定初始化方法init如果存在类实现BeanPostProcessor(处理Bean),执行postProcessAfterInitialization
8.执行业务处理
9.如果Bean实现DisposableBean执行destory
10.调用<bean destory-method=“destory”>指定销毁方法destory
5.DI——属性注入
对于类成员变量,注入方式有三种:
- 构造函数注入
- 属性setter方法注入
-
接口注入
Spring支持前两种
1.构造方法的属性注入:
- 通过构造方法注入Bean的属性值或依赖的对象,它保证了Bean实例在实例化后就可以使用
- 构造器注入在<constructor-arg>元素里生成的属性
2.set方法的属性注入(常用):
- 使用set方法注入,在Spring配置文件中,通过<property>设置注入的属性,普通类型的值使用value,对象类型的值使用ref
3.P名称空间的属性注入
- 使用p命名空间
- 为了简化xml文件配置,Spring从2.5开始引入一个新的p名称空间
- p:<属性名>="xxx"引入常量值
<bean id="" class="" p:属性名=""> - p:<属性名>-ref="xxx"引用其他bean对象
<bean id="" class="" p:对象名-ref=""> - beans中需加入: xmlns:p="http://www.springframework.org/schema/p"
4.SpEL的属性注入
- SpEL:spring expression language,spring表达式语言,对依赖注入进行简化
- <bean id="" value="#{表达式}">
- 语法:#{表达式}
#{'hello'} :使用字符串
#{beanId}:使用另一个bean
#{beanId.方法名()}:使用指定名属性,并使用方法
#{T(java.lang.Math).PI}:使用静态字段或方法
5.复杂类型的属性注入
<bean id="" class="">
//数组类型的属性注入
<property name="">
<list>
<value>xxx</value>
<value>xxx</value>
</list>
</property>
//List集合类型的属性注入
<property name="">
<list>
<value>xxx</value>
<value>xxx</value>
</list>
</property>
//Set集合类型的属性注入
<property name="">
<set>
<value>xxx</value>
<value>xxx</value>
</set>
</property>
//Map集合类型的属性注入
<property name="">
<map>
<entry key="aaa" value="111" />
<entry key="bbb" value="222" />
<entry key="ccc" value="333" />
</map>
</property>
//Properties类型的属性注入
<property name="">
<props>
<prop key="username">root</prop>
<prop key="password">123</prop>
</props>
</property>
</bean>
网友评论