//启动spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
创建对象(Java反射机制?)
1.使用无参构造器
在配置文件中配置bean元素
<bean id="bean的id(唯一)" class="类全限定名"></bean>
<bean id="stu1" class="spring.Student"></bean>
2.使用静态工厂方法创建对象(通过调用类的静态方法来创建对象)
在配置文件中配置bean元素
factory-method属性:指定一个静态方法的方法名,容器会调用该类的静态方法来创建对象。
<bean id="calendar" class="java.util.Calendar" factory-method="getInstance"></bean>
3.使用实例工厂来创建对象(通过调用对象的实例方法来创建对象)
在配置文件中配置bean元素
factory-bean:指定一个bean的id,容器会调用该bean的方法来创建一个对象。
(Calendar的getTime方法返回值类型为Date)
<bean id="date" factory-bean="calendar" factory-method="getTime"/>
获取bean
Student stu1 = ac.getBean("stu1",Student.class);
Calendar calendar = ac.getBean("calendar", Calendar.class);
Date date = ac.getBean("date",Date.class);
作用域
默认情况下,容器对于某个bean元素,只会创建一个实例。
//启动spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("scope.xml");
//获得对象
ScopeBean s1 = ac.getBean("scopebean", ScopeBean.class);
ScopeBean s2 = ac.getBean("scopebean", ScopeBean.class);
System.out.println(s1==s2);//true
指定作用域
scope属性:用来指定bean作用域,缺省值是singleton(单例,即:只会创建一个新的对象)。如果值是prototype(每次调用一次getBean方法,就会创建一个新的对象)。
- 指定scope属性值为prototype。
<bean id="scopebean" class="scope.ScopeBean" scope="prototype"/>
//启动spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("scope.xml");
//获得对象
ScopeBean s1 = ac.getBean("scopebean", ScopeBean.class);
ScopeBean s2 = ac.getBean("scopebean", ScopeBean.class);
System.out.println(s1==s2);--true
- lazy-init属性:如果值为true,表示延迟加载。
- 默认情况下,容器启动之后,会将作用域为"singleton"的bean创建好。
- 延迟加载指的是,容器启动之后,对作用域为"singleton"的bean不再创建,直到调用了getBean方法才会创建。
<bean id="msgbean" class="spring.MessageBean" init-method="init"
destroy-method="destory" lazy-init="true" />
生命周期
- init-method属性:指定初始化方法名
spring容器创建好bean实例后,会立即调用init-method指定的初始化方法。
- destroy-method属性:指定销毁方法名
spring容器关闭之前,会调用destroy-method指定的销毁方法
注意:销毁方法只对作用域为singleton的bean有效。
public class MessageBean {
public MessageBean() {
System.out.println("MessageBean()");
}
public void init() {
System.out.println("init()");
}
public void sendMsg() {
System.out.println("sendMsg()");
}
public void destory() {
System.out.println("destroy()");
}
}
<bean id="msgbean" class="spring.MessageBean" init-method="init"
destroy-method="destory" />
@Test
public void test2() {
//AbstractApplicationContext是ApplicationContext的子接口
AbstractApplicationContext ac = new ClassPathXmlApplicationContext("scope.xml");
MessageBean bean = ac.getBean("msgbean",MessageBean.class);
bean.sendMsg();
ac.close();
}