Spring Bean继承

举报
CoderX 发表于 2022/04/16 17:11:50 2022/04/16
【摘要】 Spring Bean继承 Spring Bean 的定义中可以包含很多配置信息,例如构造方法参数、属性值。子 Bean 既可以继承父 Bean 的配置数据,也可以根据需要重写或添加属于自己的配置信息。 继承方法在Spring XML配置中,通过子Bean的parent属性来指定需要继承的父Bean <!--父Bean--> <bean id="parentBean" class="org....

Spring Bean继承

Spring Bean 的定义中可以包含很多配置信息,例如构造方法参数、属性值。子 Bean 既可以继承父 Bean 的配置数据,也可以根据需要重写或添加属于自己的配置信息。

继承方法

在Spring XML配置中,通过子Bean的parent属性来指定需要继承的父Bean

 <!--父Bean-->
 <bean id="parentBean" class="org.example.ParentBean" >
     <property name="stuId" value="1"></property>
     <property name="stuName" value="张三"></property>
 </bean> 
 <!--子Bean--> 
 <bean id="childBean" class="org.example.ChildBean" parent="parentBean"></bean>

代码示例:

  1. Animal类(父bean)

     package org.parentDemo;
     ​
     /**
      * 父Bean
      */
     public class Animal {
         private String name;
         private Integer age;
     ​
         @Override
         public String toString() {
             return "Animal{" +
                     "name='" + name + '\'' +
                     ", age=" + age +
                     '}';
         }
     ​
         public void setName(String name) {
             System.out.println("Animal setName:" + name);
             this.name = name;
         }
     ​
         public void setAge(Integer age) {
             System.out.println("Animal setAge:" + age);
             this.age = age;
         }
     }
     ​


  2. Dog类(子bean)

     package org.parentDemo;
     ​
     /**
      * 子Bean
      */
     public class Dog {
         private String name;
         private Integer age;
         private String call;
     ​
         @Override
         public String toString() {
             return "Dog{" +
                     "name='" + name + '\'' +
                     ", age=" + age +
                     ", call='" + call + '\'' +
                     '}';
         }
     ​
         public void setName(String name) {
             System.out.println("Dog setName:" + name);
             this.name = name;
         }
     ​
         public void setAge(Integer age) {
             System.out.println("Dog setAge:" + age);
             this.age = age;
         }
     ​
         public void setCall(String call) {
             System.out.println("Dog setCall:" + call);
             this.call = call;
         }
     }
     ​


  3. XML配置文件

     <?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">
     ​
         <!--父Bean-->
         <bean id="animal" class="org.parentDemo.Animal">
             <property name="name" value="动物"/>
             <property name="age" value="10"/>
         </bean>
     ​
         <!--子Bean-->
         <bean id="dog" class="org.parentDemo.Dog" parent="animal">
             <property name="name" value="阿黄"/>
             <property name="age" value="12"/>
             <property name="call" value="汪汪汪!"/>
         </bean>
     ​
     </beans>


  4. Main方法

     package org.parentDemo;
     ​
     import org.springframework.context.ApplicationContext;
     import org.springframework.context.support.ClassPathXmlApplicationContext;
     ​
     public class MainApp {
         public static void main(String[] args) {
             ApplicationContext context=new ClassPathXmlApplicationContext("parentBeans.xml");
     ​
             Dog dog=(Dog) context.getBean("dog");
             System.out.println(dog);
         }
     }
     ​


  5. 运行结果

     Animal setName:动物
     Animal setAge:10
         
     Dog setName:阿黄
     Dog setAge:12
     Dog setCall:汪汪汪!
     Dog{name='阿黄', age=12, call='汪汪汪!'}


Bean定义模板

如果父Bean的abstract属性值为true,则表明这个Bean是抽象的.这个抽象的父Bean只能作为模板被子Bean继承,不能被实例化,也不能被其他Bean引用,更不能在代码中根据getBean()方法获取,否则会返回错误。

在父Bean的定义中,可选择指定class属性。如果父Bean定义没有指定class属性,那么这个父Bean的abstract属性必须为true。

代码示例:

将parentBeans的XML文件修改:

 <?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">
 ​
     <!--父Bean-->
     <bean id="animal" abstract="true">
         <property name="name" value="动物"/>
         <property name="age" value="10"/>
     </bean>
 ​
     <!--子Bean-->
     <bean id="dog" class="org.parentDemo.Dog" parent="animal">
         <property name="name" value="阿黄"/>
         <property name="age" value="12"/>
         <property name="call" value="汪汪汪!"/>
     </bean>
 ​
 </beans>

运行结果: 通过控制台输出可以看出,在 Spring 启动时,并没有实例化 animal。

 Dog setName:阿黄
 Dog setAge:12
 Dog setCall:汪汪汪!
 Dog{name='阿黄', age=12, call='汪汪汪!'}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。