bean的生命周期
bean的创建与销毁
自定义生命周期的方法:
初始化方法: init-method=""
销毁方法: init-method=""
ioc容器中注册的bean:
1), 单例bean, 容器启动的时候就会创建好, 容器关闭也会销毁创建的bean
构造器------>初始化方法------>容器关闭(对象销毁)
2), 多实例bean, 获取的时候才创建
获取bean(构造器---->初始化方法)------>容器关闭不会销毁bean
public class Book {
private String bookName;
private String author;
public Book() {
System.out.println("Book被创建");
}
public void myInit() {
System.out.println("这是book的初始化方法...");
}
public void myDestory() {
System.out.println("这是book的销毁方法....");
}
<bean id="book01" class="com.xian.bean.Book"
destroy-method="myDestory" init-method="myInit" scope="singleton"
></bean>
bean的后置处理器
spring有一个接口: BeanPostProcessor
后置处理器:可以在bean的初始化前后调用方法;
后置处理器生命周期:
(容器启动)构造器------>后置处理器(before)------>初始化方法------>后置处理器(after)------>容器关闭(对象销毁)
无论bean是否有初始化方法, 后置处理器依然会工作:(容器启动)构造器------>后置处理器(before)------>后置处理器(after)------>容器关闭(对象销毁)
public class MyBeanPostPeocessor implements BeanPostProcessor {
/**
* 初始化之前调用
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("[" + beanName + "] bean将要调用初始化方法了...");
//默认反回传入的bean;
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
/**
* 初始化之后调用
* beanName: xml中配置的id
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("[" + beanName + "] bean初始化方法调用完了了...");
return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
}
}
xml: <bean id="myBeanPostPeocessor" class="com.xian.bean.MyBeanPostPeocessor"></bean>
引用外部文件
<!-- 引用外部属性文件 依赖context名称空间
classpath:, 表示引用类路径下的一个资源 -->
<context:property-placeholder location="classpath:conf_2/dbconfig.properties"/>
数据库连接池作为单实例是最好的
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- username是Spring的key中的一个关键字, 为了防止冲突,可以加一个前缀 -->
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
</bean>
自动装配
自动赋值(自动装配):
autowire=“default”: 不自动装配
autowire=“byType”: private Car car;
以属性的类型作为查找依据, 找到需要的组件. = ioc.getBean(Car.class);
匹配不唯一, 则报错. 没有匹配的bean, 装配null.
autowire=“byName”: private Car car;
以属性名作为id去容器中找到一个组件,赋值. 如果匹配不上, 就是null
autowire=“constructor”:
按照构造器进行装配.
- 先按照类型进行装配, 没有直接为null
- 如果按照类型找到了多个, 按照参数名作为id继续装配, 找到就装配, 找不到就null.
SpEL
<!-- 使用SpEL引用字面量,使用运算符: #{} -->
<property name="salary" value="#{12*12343}"></property>
<!-- 引用其他bean的某个属性值 -->
<property name="name" value="#{car.carName}"></property>
<!-- 引用其他bean -->
<property name="car" value="#{car}"></property>
<!-- 调用静态方法:UUID.randomUUID().toString();
#{T(全类名).静态方法 名(1,2)} -->
<property name="email" value="#{T(java.util.UUID).randomUUID().toString()}"></property>
<!-- 调用非静态方法: 对象.方法名 -->
<property name="gender" value="#{car.getCarName()}"></property>
</bean>