薛彬的博客 Xue bin's Personal Growth Website

Spring学习笔记---Bean

2016-05-22
薛彬

定义

bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。

bean的属性:

属性 描述
class bean对应的java类
name 唯一的bean标识符
scope 指定由特定的 bean 定义创建的对象的作用域
properties 注入依赖关系
…… ……

比如:

<bean id="helloWorld" class="com.tutorialspoint.HelloWorld">
    <property name="message" value="Hello World!"/>
</bean>

作用域

新定义一个bean时,必须声明找个bean的作用域。

作用域 描述
singleton 该作用域将 bean 的定义的限制在每一个 Spring IoC 容器中的一个单一实例(默认)。
prototype 唯一的bean标识符
…… ……

singleton作用域

这是默认的作用域。如果设置成这个作用域,容器会创建一个由该bean定义的对象的实例,该单一实例会存储在单例bean的高速缓存中,以及针对该bean的所有后续的请求和引用都返回缓存对象。

<bean id="..." class="..." scope="singleton"></bean>

假设我们现在有这样一个类,里面就是set/get方法:

public class Person{
    private String name;
    public void setName(String name){
        this.name=name;
    }
    public void getName(){
        System.out.println("名字是:"+ name);
    }
}

还有一个main类:

public class MainApp {
   public static void main(String[] args) {
      ApplicationContext context =new ClassPathXmlApplicationContext("Beans.xml");
      Person obj = (Persond) context.getBean("person");
      //其实就是替代了Person obj = new Person();
      obj.setMessage("张三");
      obj.getMessage();
      Person objB=(Person) context.getBean("Person");
      objB.setMessage("李四");
      objB.getMessage();
   }
}

这时候我们的Beans.xml是这样的:

<bean id="helloWorld" class="com.tutorialspoint.HelloWorld" scope="singleton"></bean>

其实就是默认的作用域,运行后会有这样的结果:

如果我们把objB.setMessage("李四");这句删了,objB会打印出什么呢?

说明obj和objB其实是一个实例,把代码改成这样就会看的更清楚了:

obj.setMessage("张三");
obj.getMessage();

objB.setMessage("李四");
objB.getMessage();

obj.getMessage();

最后一条语句是打印什么呢?是张三还是李四

这就说明了刚开始对于singleton的说明,会创建一个单一实例

prototype作用域

每次特定的bean发出请求时容器就创建新的Bean实例。

满状态的 bean 使用 prototype 作用域和没有状态的 bean 使用 singleton 作用域。

这句话还没理解。

这时候我们的Beans.xml是这样的:

<bean id="helloWorld" class="com.tutorialspoint.HelloWorld" scope="prototype"></bean>

还是上面的例子:

obj.setMessage("张三");
obj.getMessage();
objB.setMessage("李四");
objB.getMessage();

同样,我们把objB.setMessage("李四");这句删了,objB会打印出什么呢?

说明objB是一个新的对象,这个新的对象的Name属性还是null。


评论