一、 生命周期
(一) lazy-init/default-lazy-init
(90%情况都不用, 所以不重要. 使用范围:程序启动速度慢, 应用启动时,Spring一次性将配置加载,并初始化.此时如果速度慢则可以考虑使用)
bean的何时初始化
lazy-init值:default:表示使用<beans>标签中的default-lazy-init值
true:表示表示context在初始化时(容器初始化即ClassPathXmlApplicationContext new出来的时
候),不会初始化这个bean,只有在使用时才会初始化
false:表示context在初始化时,就会初始化这个bean
例如:
<?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-2.5.xsd"
default-lazy-init="false">
<bean id="userDao" class="com.wjt276.dao.impl.UserDaoImpl" lazy-init="true">
<property name="daoId" value="1"></property>
</bean>
<bean id="userDao2" class="com.wjt276.dao.impl.UserDaoImpl" lazy-init="default" >
<property name="daoId" value="2"></property>
</bean>
<bean name="userService" class="com.wjt276.service.UserService" lazy-init="false">
</bean> </beans>
(二) init-method destroy-method 不要和prototype一起用(了解)
init-method:用于<bean>标签中的属性,表示在初始化这个bean之前所需要的执行方法
destroy-method:用于<bean>标签中的属性,表示在这个bean销毁时所需要的执行方法。例如关闭连接池。
注意:此属性不要与scpoe=”prototype”一起使用,否则会出现其它的问题。
例如:
<bean id="u" class="com.wjt276.dao.impl.UserDaoImpl">
<property name="daoId" value="1"></property>
</bean>
<bean name="userService" class="com.wjt276.service.UserService" init-method="init" destroy-method="destroy">
<property name="userDao" ref="u"></property> </bean>
userService类的代码
public class UserService {
public void init(){
System.out.println("现在开始初始化UserService");
}
private UserDao userDao = new UserDaoImpl();
public UserDao getUserDao() {return userDao; }
public void setUserDao(UserDao userDao) {this.userDao = userDao;}
public void add(User u){ userDao.save(u);}
public void destroy(){System.out.println("destory"); }
}
测试代码:
public void testAdd_4() throws Exception {
ClassPathXmlApplicationContext factory = new ClassPathXmlApplicationContext("beans.xml");
UserService service = (UserService)factory.getBean("userService"); //初始化该bean之前就会执行对应的init方法的内容
System.out.println(service.getUserDao());
//因为在非webApplacationContext中不能自动destory,因为需要手动destory
//而ApplicationContext没有实现destory方法,因此需要具体的实现类来destory 所以黄色背景处不使用ApplicationContext
factory.destroy();
}