zoukankan      html  css  js  c++  java
  • Spring学习记录(四)---bean之间的关系:继承、依赖

         继承

    这里说的继承和java的继承是不一样的,不是父类子类。但思想很相似,是父bean和子bean

    1、父bean是一个实例时。它本身是一个完整的bean

    2、父bean是模板,抽象bean,不能被实例化,只是来被继承。

    当遇到一个类要实例化出很多相似的bean对象时,如下,看起来是不是很不简洁

    1     <bean id="address1" class="com.guigu.spring.autowire.Address"
    2     p:city="BeiJing" p:street="yihuan"></bean>
    3     <bean id="address2" class="com.guigu.spring.autowire.Address"
    4     p:city="BeiJing" p:street="erhuan"></bean>

    方法① 两个bean除了p:street不一样,其他都一样。可以把一个作为父bean,其它的继承这个bean

    1      <bean id="address1" class="com.guigu.spring.autowire.Address"
    2      p:city="BeiJing" p:street="yihuan"></bean>
    3      <bean id="address2"  p:street="erhuan" parent="address1"></bean>
    4    // address2等价于:
    5    //  <bean id="address2"" class="com.guigu.spring.autowire.Address"
    6    //  p:city="BeiJing" p:street="erhuan"></bean>

    这里,第二个就继承了第一个bean,用parent属性,只写自己独有的属性或要覆盖的属性即可。

    方法②把相同属性提取出来,做一个抽象bean,专门用来继承

    1 <bean id="address1" class="com.guigu.spring.autowire.Address"
    2     p:city="BeiJing" p:street="yihuan" abstract="true"></bean>
    3 <bean id="address2" p:street="erhuan" parent="address1"></bean>

    这样,address2也继承了address1。address1设置了abstract="true",就不能实例化,否则抛异常。

    也可以写成这样:

    1  <bean id="address1" p:city="BeiJing" p:street="yihuan" abstract="true"></bean>
    2  <bean id="address2" class="com.guigu.spring.autowire.Address" p:street="erhuan" parent="address1"></bean>

    和上面的不同就是把class属性拿出去了。当很多不是同一个类的bean要继承父bean时,就要这样,在子bean写自己所在的class。

    这样写还有一点是,这个父bean一定不能实例化,因为它没有class属性,实例化会跑异常。那就一定要写abstract属性,让spring不实例化它。

         依赖---depends-on

    用Person类的例子

     1 public class Person {
     2     private String name;
     3     private Car car;
     4     
     5     public String getName() {
     6         return name;
     7     }
     8     public void setName(String name) {
     9         this.name = name;
    10     }
    11     public Car getCar() {
    12         return car;
    13     }
    14     public void setCar(Car car) {
    15         this.car = car;
    16     }
    17     @Override
    18     public String toString() {
    19         return "Person [name=" + name + ", car=" + car + "]";
    20     }
    21 }

     有一个属性Car没有配置,那实例化后,它就是null。

    1  <bean id="person" class="com.guigu.spring.autowire.Person"
    2      p:name="Evan"></bean>

     有时,我们需要让某个属性必须存在,就像必填项一样。 用depends-on 依赖

    1   <bean id="person" class="com.guigu.spring.autowire.Person"
    2       p:name="Evan" depends-on="car"></bean>

    这样表示,实例化person一定要依赖car,没有配置car会抛异常

    1  <bean id="car" class="com.guigu.spring.autowire.Car" p:brand="Audi" p:price="200000"></bean>
    2  <bean id="person" class="com.guigu.spring.autowire.Person"
    3        p:name="Evan" depends-on="car"></bean>

    这样,依赖的car存在,就可以正常实例化了

  • 相关阅读:
    多任务并行
    不同方法来移动数据库(更改磁盘时用)(转)
    ASP.NET执行SQL超时的解决方案
    SQL Server 简单模式下,误删除堆表记录如何恢复(绕过页眉校验) (转)
    关于跟踪标记
    .NET分布式事务处理
    安装SQL Server 2005时出现COM+的警告/错误,下面是微软给出的解决方法。
    PHP中如何获取多个checkbox的值
    C# 模拟post数据提交时 出现如下错误: System.Net.WebException: 远程服务器返回错误: (417) Expectation Failed 的解决办法
    winform出现"LC.exe"已退出,代码为1
  • 原文地址:https://www.cnblogs.com/ooooevan/p/5801342.html
Copyright © 2011-2022 走看看