Spring学习笔记03--bean的作用域(scope属性)

1。 spring容器在创建Java Bean的时候,默认是在容器初始化的时候创建,并且创建的Bean都是单例的
如果想指定这个bean不是单例,则可以指定scope=”prototype” 或者 singleton = “false”
关于scope属性,可以参照这篇文章

2。指定单例模式的同时,如果希望这个Bean在容器初始化的时候,不被创建,而是调用ctx.getBean()方法的时候才被创建,则可以在该bean标签指定 lazy-init=“true”,这时候,这个bean会在第一次获取的时候给创建。 如果要指定所有的Bean都不在容器初始化就创建,则可以在beans标签指定属性 default-lazy-init= “true”

3。有时候我们希望Bean在被初始化的时候调用一个初始化方法,做一些初始化的操作,那么可以定义这个方法,并在bean标签里面指定 init-method = “xxx”,这里的xxx是这个初始化方法的方法名。并且这个方法即使被指定为private也没有影响(说明spring内部是通过反射实现的)。

4。同样的,如果需要在Bean被销毁的时候,执行一个销毁的方法,则可以指定属性 destroy-method=”xxx” 。
那么,这个bean是什么时候被销毁的呢?如果没有手动的销毁这个bean,则这个bean会一直存在于spring容器中,知道spring容器被关闭时,这个bean才会被销毁。我们可以调用spring容器的close方法正常关闭spring容器。
需要注意的是,这个close()方法,ApplicationContext类没有,所以需要将引用类型改为ClassPathXmlApplicationContext类型:

@Test
    public void instanceSpring(){
        //初始化Spring容器
        AbstractXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
        IPersonService personService = (IPersonService) ctx.getBean("personService");
        personService.save();
        ctx.close();
    }

运行结果:
Spring学习笔记03--bean的作用域(scope属性)_第1张图片
需要注意的是,要想容器关闭时,bean的destroy()方法被调用,这个bean必须是单例的。

你可能感兴趣的:(Spring)