zoukankan      html  css  js  c++  java
  • Spring Bean的定义及作用域

    目录:

    1. 了解Spring的基本概念

    2. Spring简单的示例

    Bean的定义

    简单地说Bean是被Spring容器管理的Java对象,Spring容器会自动完成对Bean的实例化。

    那么什么是容器呢?如果看过上篇简单的Spring示例。

    其中有如下代码:

    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

    context就是一个容器,当然这不是官方最准确的定义,不过初步学习,我们知道这个实例化对象就是个容器就行了。

    第二篇随笔中,配置文件内容如下:

    <?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-3.0.xsd">
    
    <!--    id自己命名,class就是需要注入属性的类-->
        <bean id="c" class="Category">
    <!--        name就是属性的名称,value就是注入到该属性的值-->
            <property name="name" value="Hello Word"/>
        </bean>
    </beans>

    bean定义时的属性列表如下(摘自w3cschool):

    属性描述
    class 这个属性是强制性的,并且指定用来创建 bean 的 bean 类。
    name 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。
    scope 这个属性指定由特定的 bean 定义创建的对象的作用域,它将会在 bean 作用域的章节中进行讨论。
    constructor-arg 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。
    properties 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。
    autowiring mode 它是用来注入依赖关系的,并会在接下来的章节中进行讨论。
    lazy-initialization mode 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例。
    initialization 方法 在 bean 的所有必需的属性被容器设置之后,调用回调方法。它将会在 bean 的生命周期章节中进行讨论。
    destruction 方法 当包含该 bean 的容器被销毁时,使用回调方法。它将会在 bean 的生命周期章节中进行讨论。

    Bean的作用域

    上面表格中,scope属性就是用来指定作用域的。其值及描述如下:

    作用域描述
    singleton

    在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,默认值

    prototype 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()
    request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
    session 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境
    global-session 一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境

    下面我们就来写两个常用的作用域。

    首先准备一个类,这个类不用变

    public class Category {
        //属性
        private String name;
        //设置该属性的方法
        public void setName(String name){
            this.name=name;
        }
        //获取该属性的方法
        public void getName(){
            System.out.println(name);
        }
    }

    singleton作用域:

    配置文件:

    <?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-3.0.xsd">
    
    <!--    id自己命名,class就是需要注入属性的类-->
        <bean id="c" class="Category" scope="singleton">
       </bean>
    </beans>

    测试类

    public class TestSpring {
        public static void main(String[] args) {
            //Spring的API ApplicationContext。applicationContext.xml就是自己创建的配置文件
            ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
            //c就是后面配置文件的id
            Category category=(Category)context.getBean("c");
            //不在配置文件中设置,用set方法设置属性的值
            category.setName("第一次设置");
            category.getName();
            //第二个对象
            Category category1=(Category)context.getBean("c");
            //不用设置,直接获取属性的值
            category1.getName();
        }
    }

    最后的结果是:

    第一次设置
    第一次设置

    两次输出相同的内容,说明id为c的bean只有1个,两次返回的都是同一个值。

    prototype作用域:

    配置文件中的scope改成prototype。其他所有代码不变,包括测试类

    最后输出:

    第一次设置
    null

    说明容器每次调用getBean时返回的是一个新的实例,所以第一次设置对第二个对象无效。

  • 相关阅读:
    数据库的接口
    BionicThe README from the bionic/libc
    发现问题——创新的原动力
    使用ADO或ADO控件访问数据库
    游标、事务并发和锁三者之间的那点事
    处女座——菜鸟程序员的工程总结
    数据库的基础知识以及创建数据库
    《Team Geek》前言(中文,自己翻译的)
    万里长征,始于足下——菜鸟程序员的学习总结(一)
    与RMAN相关的动态性能视图
  • 原文地址:https://www.cnblogs.com/lbhym/p/11898253.html
Copyright © 2011-2022 走看看