1.Spring容器的作用:
Spring容器只能管理singleton作用域Bean的生命周期,Spring容器知道Bean何时创建、何时初始化、何时销毁。
2.Spring初始化bean的过程,代码演示如下:
1.创建Phone.java类
package com.learnSpring08;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class Phone implements BeanNameAware,ApplicationContextAware,InitializingBean{
private int id;
private String name;
private double price;
public Phone(){
System.out.println("Spring创建Phone对象实例");
}
public void setId(int id) {
System.out.println("Spring调用setId()方法执行依赖注入id值");
this.id = id;
}
public void setName(String name) {
System.out.println("Spring 调用setName()方法执行依赖注入name值");
this.name = name;
}
public void setPrice(double price) {
System.out.println("Spring 调用setPrice()方法执行依赖注入price");
this.price = price;
}
@Override
public String toString() {
return "Phone [id=" + id + ", name=" + name + ", price=" + price + "]";
}
public void init(){
System.out.println("正在执行初始化init()方法....");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("正在执行初始化方法afterPropertiesSet() ");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("设置bean的应用上下文");
}
@Override
public void setBeanName(String name) {
System.out.println("设置bean的名字");
}
}
2.配置bean07.xml
<?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.xsd">
<bean id="phone" class="com.learnSpring08.Phone" init-method="init">
<property name="id" value="6666"></property>
<property name="name" value="华为"></property>
<property name="price" value="4999"></property>
</bean>
</beans>
3.测试
package com.learnSpring08;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support
.ClassPathXmlApplicationContext;
public class testPhone {
@Test
public void testDemo(){
ApplicationContext context=new
ClassPathXmlApplicationContext("bean07.xml");
Phone p=context.getBean("phone",Phone.class);
}
}
控制台输出结果为:
Spring创建Phone对象实例
Spring调用setId()方法执行依赖注入id值
Spring 调用setName()方法执行依赖注入name值
Spring 调用setPrice()方法执行依赖注入price
设置bean的名字
设置bean的应用上下文
正在执行初始化方法afterPropertiesSet()
正在执行初始化init()方法....
总结:从输出结果可以看出Spring容器创建一个bean实例的全部过程。
3.Spring销毁bean的全过程
1.创建Phone.java类
package com.learnSpring08;
import org.springframework.beans.factory.DisposableBean;
public class Phone implements DisposableBean{
private int id;
private String name;
private double price;
public Phone(){
System.out.println("Spring创建Phone对象实例");
}
public void setId(int id) {
System.out.println("Spring调用setId()方法执行依赖注入id值");
this.id = id;
}
public void setName(String name) {
System.out.println("Spring 调用setName()方法执行依赖注入name值");
this.name = name;
}
public void setPrice(double price) {
System.out.println("Spring 调用setPrice()方法执行依赖注入price");
this.price = price;
}
@Override
public String toString() {
return "Phone [id=" + id + ", name=" + name + ", price=" + price + "]";
}
public void close(){
System.out.println("正在执行初始化close()方法....");
}
@Override
public void destroy() throws Exception {
System.out.println("正在执行销毁之前的方法destroy()");
}
}
2.配置bean07.xml
<?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/schem/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="phone" class="com.learnSpring08.Phone"
destroy-method="close">
<property name="id" value="6666"></property>
<property name="name" value="华为"></property>
<property name="price" value="4999"></property>
</bean>
</beans>
3.测试
package com.learnSpring08;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class testPhone {
@Test
public void testDemo(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean07.xml");
Phone p=context.getBean("phone",Phone.class);
((AbstractApplicationContext) context).close();
}
}
控制台输出结果为:
Spring创建Phone对象实例
Spring调用setId()方法执行依赖注入id值
Spring 调用setName()方法执行依赖注入name值
Spring 调用setPrice()方法执行依赖注入price
八月 17, 2017 11:15:36 上午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@6ed3ef1: startup date [Thu Aug 17 11:15:36 CST 2017]; root of context hierarchy
正在执行销毁之前的方法destroy()
正在执行初始化close()方法....