Spring Bean作用域

Bean的作用域

当在Spring中定义一个bean时,你必须声明该bean的作用域的选项。例如,为了强制Spring在每次需要时都产生一个新的bean实例,你应该申明bean的作用域属性为prototype。同理,如果你像让Spring在每次需要时都返回同一个bean实例,你应该声明bean的作用域的属性为sigleton。Spring框架支持以下五个作用域,如果你使用web-aware ApplicationContext时,其中三个是可用的。

作用域名称 描述
sigleton 该作用域将bean的定义限制在每一个SpringIoc容器中的一个单一实例
prototype 该作用域将单一bean的定义限制在任意数量的对象实例
request 该作用域将bean的定义限制为HTTP请求。只在web-awareSpringApplicationContext的上下文中有效
session 该作用域将 bean 的定义限制为 HTTP 会话。 只在web-aware Spring ApplicationContext的上下文中有效。
global-session 该作用域将 bean 的定义限制为 HTTP全局 会话。 只在web-aware Spring ApplicationContext的上下文中有效。

 Singleton作用域:

如果作用域设置为singleton,那么Spring IoC容器刚好创建一个由该bean定义的对象的实例。该单一实例将存储在这种单例bean的高速缓存中,以及针对该bean的所有后续的请求和引用的返回缓存对象。默认的作用域始终是singleton,但是当仅仅需要bean的一个实例时,你可以在bean的配置文件中设置作用域的属性为singleton,:

<bean id="helloWorld1" class="com.tutorialspoint.HelloWorld" scope="singleton">
    <property name="message" value="hello fpc!"></property>
</bean>

下面是MainApp.java文件中的内容:

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
//        XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("Beans.xml"));
//        HelloWorld h = (HelloWorld) factory.getBean("helloWorld");
        HelloWorld h = (HelloWorld) context.getBean("helloWorld1");
        System.out.println(h.getMessage());
        h.setMessage("hhhhhhhhhh");
        System.out.println(h.getMessage());
        HelloWorld h1 = (HelloWorld) context.getBean("helloWorld1");
        System.out.println(h1.getMessage());
    }
}

一旦创建源码和bean配置文件完成后,我们就可以运行该应用程序。上述程序将输出以下结果:

prototype作用域

如果作用域设置为prototype,那么每次特定的bean发出请求时Spring IoC容器就创建对象的新的Bean实例。一般来说,满状态的bean使用prototype作用域和没有状态的bean使用singleton作用域。

为了定义prototype作用域,你可以在bean的配置文件中设置作用域的属性为prototype,如下图所示:

<bean id="helloWorld1" class="com.tutorialspoint.HelloWorld" scope="prototype">
    <property name="message" value="hello fpc!"></property>
</bean>

下面是MainApp.java文件的内容:

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
//        XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("Beans.xml"));
//        HelloWorld h = (HelloWorld) factory.getBean("helloWorld");
        HelloWorld h = (HelloWorld) context.getBean("helloWorld1");
        System.out.println(h.getMessage());
        h.setMessage("hhhhhhhhhh");
        System.out.println(h.getMessage());
        HelloWorld h1 = (HelloWorld) context.getBean("helloWorld1");
        System.out.println(h1.getMessage());
    }
}

运行的结果为:

 

posted @ 2017-11-03 15:05  起床oO  阅读(216)  评论(0编辑  收藏  举报