Spring框架之Day02工厂和bean的作用域与生命周期

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()销毁方法
    }
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__0809 返回首页