bean的作用域
单实例
默认scope=singleton
1.在容器启动完成就已经创建好对象保存在容器中
多次获取是同一个bean,物理地址相同
<bean id="book" class="com.lwt.bean.Book" scope="singleton"></bean>
多实例的bean
scope=prototype
每次获取创建新的实例对象
<bean id="book" class="com.lwt.bean.Book" scope="prototype"></bean>
工厂
静态工厂
class:指定静态工厂的全类名
factory-method:指定工厂方法 constructor-arg为方法形参
实例工厂
工厂类 工厂对象 = new 工厂类();
工厂对象.getSkrit();
实例工厂:
先创建实例工厂对象
接口FactoryBean
<bean id="skritInstanceFactory" class="com.lwt.factory.SkritInstanceFactory">
</bean>
factory-bean创建的bean使用的指定工厂实例
factory-method 使用指定的工厂方法
<bean id="skrit02" class="com.lwt.bean.Skrit" factory-bean="skritInstanceFactory" factory-method="getSkrit">
<constructor-arg value="裸腿裙"></constructor-arg>
</bean>
public class SkritInstanceFactory {
// 先 new SkritInstanceFactory()
public Skrit getSkrit(String skritName){
System.out.println("实例工厂正在制作超短jk裙");
Skrit skrit = new Skrit();
skrit.setSkritName("jk");
skrit.setSkritColor("粉色");
skrit.setSkritShort("实例超短裙");
return skrit;
}
}
这个接口的实现类,spring都认为是一个工厂
FactoryBean 实现此接口成为一个spring工厂
不管bean是单实例还是多实例,ioc容器启动后均不会自动创建实例
<bean id="myFactoryBeanImpl" class="com.lwt.factory.Impl.MyFactoryBeanImpl">
</bean>
/**
* 实现了FactoBean接口的类是Spring识别的工厂类
* Spring自动调用工厂方法创建实例
* @Author Li Weitong
* @Date 2020/12/3 19:49
*/
public class MyFactoryBeanImpl implements FactoryBean<Skrit> {
/**
* 工厂方法 spring自动调用
* @return
* @throws Exception
*/
@Override
public Skrit getObject() throws Exception {
System.out.println("MyFactoryBeanImpl自动调用getObject()帮助创建Skrit对象");
Skrit skrit = new Skrit();
skrit.setSkritName("百褶裙");
return skrit;
}
/**
* 返回创建的对象的类型 spring自动调用确认创建的对象是什么类型
* @return
*/
@Override
public Class<?> getObjectType() {
return Skrit.class;
}
/**
* 是单实例
* @return
*/
@Override
public boolean isSingleton() {
return false;
}
}
测试:
@Test
public void test4() {
Object bean = ioc.getBean("myFactoryBeanImpl");
Object bean1 = ioc.getBean("myFactoryBeanImpl");
System.out.println(bean == bean1); // 单实例为true 多实例为false
}
带声生命周期方法的bean
bean的声明周期 bean的创建到销毁(容器启动)构造器->初始化方法->(容器关闭)销毁方法
ioc容器中创建的bean 单例bean 容器启动已创建 ,容器关闭销毁bean
多实例bean 容器启动不创建 获取bean的时候才创建bean才开始初始化 容器关闭不自动调用裙子对象中的myDestroy()方法
为bean自定义声明周期方法,spring在创建销毁是调用指定的方法
<bean id="skrit01" class="com.lwt.bean.Skrit" destroy-method="myDestroy" init-method="myInit" scope="prototype"></bean>
</beans>
public class Skrit {
private String skritName;
private String skritColor;
private String skritShort;
public void myInit(){
System.out.println("初始化裙子");
}
public void myDestroy(){
System.out.println("销毁裙子");
}
public Skrit() {
System.out.println("裙子的无参构造器");
}
测试:
public class IOCtest4 {
private ConfigurableApplicationContext ioc = new ClassPathXmlApplicationContext("spring-config4.xml");
@Test
public void test1() {
System.out.println("容器关闭");
ioc.close(); // 容器关闭后调用裙子的myDestroy()销毁方法
}
}