Spring 学习(三) Bean 作用域及自动装配

1. Bean 作用域

作用域描述
singleton将每个 Spring IoC 容器的单个 bean 定义范围限定为单个对象实例。
prototype将单个 bean 定义的作用域限定为任意数量的对象实例。
request将单个 bean 定义的范围限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有一个在单个 bean 定义的后面创建的bean实例。仅在 web-aware Spring 中有效 ApplicationContext
session将单个 bean 定义的范围限定为 HTTP 的生命周期 Session。仅在 web-aware Spring 中有效 ApplicationContext
application将单个 bean 定义的作用域限定为的生命周期 ServletContext。仅在 web-aware Spring 中有效 ApplicationContext
websocket将单个 bean 定义的作用域限定为的生命周期 WebSocket。仅在 web-aware Spring 中有效 ApplicationContext
  • singleton(单例模式):一个类仅有一个对象实例,是 bean 的默认值。

    <!--默认-->
    <bean id="accountService" class="com.something.DefaultAccountService"/>
    <!--显式设置-->
    <bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bqca9DMy-1625457733282)(Spring.assets/singleton.png)]

  • prototype(多例模式):一个类可有多个对象实例。

    <bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-254kYY5m-1625457733285)(Spring.assets/prototype.png)]

  • Request、Session、Application 和 WebSocket 仅在 web-aware 项目中有效。

2. Bean 的自动装配

  • Spring 有三种装配方式

    • 在 xml 中显示配置
    • 在 Java 中显示配置
    • 隐式装配(自动装配)
      • 自动装配是 Spring 满足 Bean 依赖的一种方式。
      • Spring 会在上下文中自动寻找并给 Bean 装配属性。
  • 自动装配使用 <bean/> 标签的 autowire 属性为 bean 指定自动装配模式。自动装配功能有如下四种模式:

    属性值描述
    no无自动装配。Bean 引用必须由 ref 元素定义,是 autowire 属性的默认值。
    byName按属性名称自动装配。Spring 寻找与需要自动装配的属性同名的 bean 。例如,如果将 Bean 定义设置为按名称自动装配,并且该 Bean 定义包含 master 属性(即,它具有 setMaster(..) 。方法)时,Spring 查找名为 master 的 bean 定义并使用它设置属性。
    byType基于 set 方法。如果容器中只存在一个属性类型的 bean,则允许对该属性进行自动绑定。如果存在多个 Bean,则会报错。
    constructor类似于 byType ,但基于构造函数参数。如果容器中没有包含所有需要装配的属性的参数的构造函数参数类型的 bean,则会抛出异常。例如,Bean 定义包含 catdog 属性,那么使用了这两个属性的类中必须有参数为 CatDog 的构造函数。
    • 定义三个模板类

      package com.why.pojo;
      public class Cat {
          public void shout(){ System.out.println("Miao~"); }
      }
      
      package com.why.pojo;
      public class Dog {
          public void shout(){ System.out.println("Wang~"); }
      }
      
      package com.why.pojo;
      public class People {
          private Cat cat;
          private Dog dog;
          private String name;
          public void setCat(Cat cat) { this.cat = cat; }
          public void setDog(Dog dog) { this.dog = dog; }
          public void setName(String name) { this.name = name; }
      }
      
    • no 示例

      <bean id="cat" class="com.why.pojo.Cat"/>
      <bean id="dog" class="com.why.pojo.Dog"/>
      <bean id="people" class="com.why.pojo.People">
          <property name="cat" ref="cat"/>
          <property name="dog" ref="dog"/>
          <property name="name" value="Why"/>
      </bean>
      
    • byName 示例

      <!--dog 和 cat 分别有一个与之对应的 setDog 和 setCat 方法-->
      <bean id="cat" class="com.why.pojo.Cat"/>
      <bean id="dog" class="com.why.pojo.Dog"/>
      <bean id="people" class="com.why.pojo.People" autowire="byName">
          <property name="name" value="Why"/>
      </bean>
      
    • byType 示例

      <!--dog 和 cat 是不同的引用类型,即 class 属性唯一,可将 dog 和 cat 的 id 属性省略-->
      <bean id="cat" class="com.why.pojo.Cat"/>
      <bean id="dog" class="com.why.pojo.Dog"/>
      <bean id="people" class="com.why.pojo.People" autowire="byType">
          <property name="name" value="Why"/>
      </bean>
      
    • constructor 示例

      <!--People 类中需要设置一个构造函数: Public People(Cat cat, Dog dog){...}-->
      <bean id="cat" class="com.why.pojo.Cat"/>
      <bean id="dog" class="com.why.pojo.Dog"/>
      <bean id="people" class="com.why.pojo.People" autowire="constructor">
          <property name="name" value="Why"/>
      </bean>
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值