bean 在什么时候 初始化?
1 初始化sping 容器的时候
2 被注入的时候
默认情况下1
scope="prototype"情况下:被注入的时候
scope="singleton"情况下:初始化sping 容器的时候(默认)
但是可以通过lazy-init的设置,来改变bean初始化时机
lazy-init="true"情况下 被注入的时候
lazy-init="false"情况下 初始化sping 容器的时候
(不推荐懒惰加载 如果加载错误, 暴露的越早越好)
如果希望 bean 在初始化以后(构造函数)执行init方法
sping 容器关闭后销毁BeanFactory中的bean后执行detroy 方法
配置文件如下
<bean id="personService" class="five.spring.service.impl.PersonServiceBean" lazy-init="true" init-method="init" destroy-method="destroy"></bean>
//
//
package five.spring.junit;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import five.spring.service.PersonService;
public class SpringTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test
public void instanceSpring() {
// 在类路径下,寻找配置文件,实例化spring容器。
// AbstractApplicationContext 是ClassPathXmlApplicationContext 的父类
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("/five/fivebeans.xml");
//配置文件中bean的id,推荐首字母小写
PersonService personServiceA = (PersonService)ctx.getBean("personService");
PersonService personServiceB = (PersonService)ctx.getBean("personService");
personServiceA.savePerson();
//判断是不是不是一个对象
if (personServiceA != personServiceB) {
}
//要调用spring容器的close方法进行关闭才能执行销毁方法,
//与前面代码有一定不同要调用spring容器的close方法进行关闭才能执行销毁方法
//须调用AbstractApplicationContext下面的close方法,才会执行,
ctx.close();
}
}
//
package five.spring.service;
public interface PersonService {
//面向接口编程,降低耦合度
public abstract void savePerson();
}
//
package five.spring.service.impl;
import five.spring.service.PersonService;
//1 构造函数
public class PersonServiceBean implements PersonService {
public PersonServiceBean(){
System.out.println("我是包[five.spring.service.impl]的" +
"类[PersonService]的构造方法");
}
public void savePerson() {
System.out.println("我是包[five.spring.service.impl]的" +
"类[PersonService]的[savePerson]方法");
}
public void init() {
System.out.println("我是包[five.spring.service.impl]的" +
"类[PersonService]的[init]方法");
}
public void destroy() {
System.out.println("我是包[five.spring.service.impl]的" +
"类[PersonService]的[destroy]方法");
}
}
//