懒加载
<!-- 懒加载bean会通知IoC不要让bean预初始化而是在被引用的时候才会实例化 -->
<bean id="person1" name="person" class="com.nanborone.bean.Person" lazy-init="true" />
<!-- 在容器级别控制延迟初始化 -->
<beans default-lazy-init="true" />
初始化/销毁方法
在创建对象的时候,我们可以根据需要调用初始化和销毁的方法。在bean的scope属性值prototype的情况下,不会执行销毁的方法。使用工厂模式依然可以指定bean的初始化和销毁方法,但是在FactoryBean创建的情况下不可用。
<!-- init-method:构造方法执行完执行,destroy-method:在容器关闭时执行 -->
<bean id="person" class="com.nanborone.bean.Person" init-method="init" destroy-method="destroy" />
在实体类中添加初始化和销毁的方法:
public void init() {
System.out.println("对象被初始化");
}
public void destroy() {
System.out.println("对象被销毁");
}
public class IocTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Application.xml");
Person person = context.getBean("person", Person.class);
System.out.println(person);
// ApplicationContext没有close方法,需要使用具体的子类
((ClassPathXmlApplicationContext) context).close();
}
}
初始化方法的前后处理方法
spring中包含一个BeanPostProcessor的接口,可以在bean的初始化方法的前后调用该方法,如果配置了初始化方法的前置和后置处理器,无论是否包含初始化方法,都会进行调用,但是无法处理通过FactoryBean创建的bean。
<bean id="myBeanPostProcessor" class="com.nanborone.bean.beanpostprocessor.MyBeanPostProcessor"/>
创建MyBeanPostProcessor 类:
public class MyBeanPostProcessor implements BeanPostProcessor {
// 在初始化方法调用之前执行
@Nullable
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization:"+beanName+"调用初始化前置方法");
return bean;
}
// 在初始化方法调用完成后执行
@Nullable
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization:"+beanName+"调用初始化后缀方法");
return bean;
}
}