applicationContext.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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- IOC容器的配置: 要创建的所有的对象都配置在这里-->
<bean id="user" class="cn.itcast.a_hello.User" init-method="init_user" destroy-method="destroy_user" scope="singleton" lazy-init="false"></bean>
</beans>
App2_bean.java
public class App2_bean {
/**
* 1) 对象创建: 单例/多例
* scope="singleton", 默认值, 即 默认是单例 【service/dao/工具类】
* scope="prototype", 多例; 【Action对象】
*
* 2) 什么时候创建?
* scope="prototype" 在用到对象的时候,才创建对象。
* scope="singleton" 在启动(容器初始化之前), 就已经创建了bean,且整个应用只有一个。
* 3)是否延迟创建
* lazy-init="false" 默认为false, 不延迟创建,即在启动时候就创建对象
* lazy-init="true" 延迟初始化, 在用到对象的时候才创建对象
* (只对单例有效)
* 4) 创建对象之后,初始化/销毁
* init-method="init_user" 【对应对象的init_user方法,在对象创建之后执行 】
* destroy-method="destroy_user" 【在调用容器对象的destriy方法时候执行,(容器用实现类)】
*/
@Test
public void testIOC() throws Exception {
// 得到IOC容器对象 【用实现类,因为要调用销毁的方法】
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("cn/itcast/a_hello/applicationContext.xml");
System.out.println("-----容器创建-----");
// 从容器中获取bean
User user1 = (User) ac.getBean("user");
User user2 = (User) ac.getBean("user");
System.out.println(user1);
System.out.println(user2);
// 销毁容器对象
ac.destroy();
}
}
User.java
public class User {
private int id;
private String name;
public User() {
super();
System.out.println("------User对象创建------");
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void init_user() {
System.out.println("创建对象之后,初始化");
}
public void destroy_user() {
System.out.println("IOC容器销毁,user对象回收!");
}
}
打印日志;
测试结果,会先去创建User()对象
------User对象创建------
接着调用init_user()方法
创建对象之后,初始化
回到测试类中,创建容器
-----容器创建-----
配置文件中声明了对象为单例
cn.itcast.a_hello.User@56f0cb3c
cn.itcast.a_hello.User@56f0cb3c
销毁容器对象,ac.destroy();调用User类的destroy_user()方法
打印日志;
IOC容器销毁,user对象回收!
============================================================================================================================
如果scope=prototype,结果会
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@5d352367: defining beans [user]; root of factory hierarchy
-----容器创建-----
------User对象创建------
创建对象之后,初始化
------User对象创建------
创建对象之后,初始化
cn.itcast.a_hello.User@63e708b2
cn.itcast.a_hello.User@54ec115b
2017-2-2 11:07:38 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@59d0d45b: startup date [Thu Feb 02 11:06:47 CST 2017]; root of context hierarchy