1、通过构造器或工厂方法创建Bean实例;
2、为Bean的属性赋值或者引用其他Bean;
3、调用Bean的初始化方法;
4、使用Bean;
5、当IOC容器关闭时,调用Bean的销毁方法。
在Spring XML文件的bean标签中,可以通过init-method和destroy-method属性指定初始化和销毁方法。还可以配置bean的后置处理器,在初始化方法执行前后执行。具体的代码如下所示。
public class Student {
private String sname;
private int sno;
private Map<String,Course> course;
public Student() {
System.out.println("这是构造方法");
}
public void fun1(){
System.out.println("这是初始化方法");
}
public void fun2(){
System.out.println("这是销毁方法");
}
}
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("after:"+bean+" "+beanName);
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("before:"+bean+" "+beanName);
return bean;
}
}
<bean id="student1" class="com.spring.beans.test.Student" init-method="fun1" destroy-method="fun2"></bean>
<!-- 配置bean的后置处理器 实现BeanPostProcess接口 -->
<bean class="com.spring.beans.test.MyBeanPostProcessor"></bean>
最后使用main方法对student1这个bean对象进行实例化和输出,其中main方法中使用ctx.close()
将IOC容器关闭,结果如下图所示。
Spring常要用来整合其他框架,如持久层框架。以数据库数据源为例,首先在项目中新建db.properties文件,存放数据连接信息,然后进行属性配置。代码如下。
<!-- 导入属性文件 -->
<context:property-placeholder location="classpath:db.properties" />
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 使用外部属性文件的属性 -->
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="jdbcUrl" value="${jdbcUrl}"></property>
<property name="driverClass" value="${driverClass}"></property>
</bean>
3、Bean自动装配
在bean标签里的autowire属性里指定自动装配的模式,byName根据名字进行自动装配,若没有则不装配,也可以使用byType根据类型装配,但如果有一个以上的相同类型会抛出异常。
<bean id="student2" class="com.spring.beans.test.Student" p:sname="李四" autowire="byName"></bean>
上述代码里面使用了p命名空间,可以简化原来标签里name和value属性的写法。基于注解的方式在属性前加上@Autowire注解也可进行自动装配。
4、Bean的继承在bean标签中使用parent属性指定父bean,子bean也可以覆盖父bean的配置。代码如下所示。
<bean id="student2" class="com.spring.beans.test.Student"
p:sname="李四" autowire="byName"></bean>
<bean id="student3" p:sname="王五" parent="student2"></bean>
5、Bean的作用域
默认的作用域是singleton,容器初始化时创建bean实例,整个容器的生命周期内只创建这一个bean。还有一个常用的是prototype,容器初始化时不创建bean实例,而在每次请求时都创建一个新的bean实例。
6、SPEL表达式类似于JSP页面中的EL表达式,使用#{}作为定界符,可以在value属性中引用字面常量(加单引号)或者其他的bean(不加引号)。也可以进行运算等操作。