Spring中的单例bean

1. 无论我们是否主动获取bean对象,spring上下文一加载就会创建bean对象
2.无论获取多少次,拿到的都是同一个对象
测试:
package com.yuan.demo;

public class Notepad {
    public Notepad() {
        super();
        System.out.println("NotePad的构造函数...."+this.toString());
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id = "notepad" class="com.yuan.demo.Notepad"></bean>
</beans>
package com.yuan.demo;

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class NotePadTest {
    
    @Test
    public void test01(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Notepad notepad1 = (Notepad)context.getBean("notepad");
        Notepad notepad2 = (Notepad)context.getBean("notepad");
        System.out.println(notepad1 == notepad2);

    }
}


package com.yuan.demo;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class NotePadAutowired {

    @Autowired
    private Notepad notepad1;

    @Autowired
    private Notepad notepad2;

    @Test
    public void test01(){
        System.out.println(notepad1==notepad2);
    }
}


bean的作用域

scope属性定义作用域
单例(singleton):整个程序只创建bean的一个实例
原型(prototype):每次注入或者通过spring获取上下文时,都会创建一个新的bean实例
会话(session):web应用中,为每个会话创建一个bean实例
请求(request):web应用中,为每个请求创建一个bean实例

自动装配中定义bean的作用域

@Scope("prototype")
@Scope(scopeName ="prototype")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

延迟加载

通过设置lazy-init实现
<bean id = "notepad" class="com.yuan.demo.Notepad" lazy-init="true"></bean>
或者通过@Lazy注解实现,只针对singleton的情况

对象的初始化和销毁

目标:让spring自动调用init和destory方法
package com.yuan.demo;

public class Notepad {
    public Notepad() {
        super();
        System.out.println("NotePad的构造函数...."+this.toString());
    }
    
    public void init(){
        System.out.println("NotePad的初始化方法");
    }

    public void destory(){
        System.out.println("NotePad的销毁方法");
    }

}

<bean id = "notepad" class="com.yuan.demo.Notepad" destroy-method="destory" init-method="init"></bean>

测试:
package com.yuan.demo;

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class NotePadTest {
    
    @Test
    public void test01(){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Notepad notepad1 = (Notepad)context.getBean("notepad");
//        Notepad notepad2 = (Notepad)context.getBean("notepad");
//        System.out.println(notepad1 == notepad2);

        context.destroy();

    }
}