Spring中xml标签abstract和parent使用

1. 概述

本篇博客主要记录和练习Spring中xml配置下,标签abstractparent的用法。

代码设定:

主程序包括3个实现类:

  • LiwanLiangImpl
  • SchoolImpl
  • CompanyImpl

其中,LiwanLiangImpl和SchoolImpl依赖于CompanyImpl

本篇博客代码基于之前的代码修改,主要目的在于练习xml配置的标签使用

2. 代码及测试

LiwanLiangImpl的源码

package com.liwl.dev;

public class LiwanLiangImpl implements LiwanLiang{
    
    private String name;
    private String address;
    private Company company;

    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

    @Override
    public String toString() {
        return "[LiwanLiangImpl bean info]" + "\nname:" + name + "\naddress:" + address + "\ncompany:" + company; 
    }
}

SchoolImpl的源码

package com.liwl.dev;

public class SchoolImpl implements School{

    private String name;
    private String address;
    private Company company;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

    @Override
    public String toString() {
        return "[SchoolImpl bean info]" + "\nname:" + name + "\naddress:" + address + "\ncompany:" + company;
    }
}

Company.java

package com.liwl.dev;

public class CompanyImpl implements Company {

    private String name;
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String company) {
        this.name = company;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }


    @Override
    public String toString() {
        return "[CompanyImpl bean info]" + "\nname:" + name + "\naddress:" + address;
    }
}

springdi.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/context 
        https://www.springframework.org/schema/context/spring-context.xsd">


    <bean id="company" class="com.liwl.dev.CompanyImpl"/>

    <bean id="comp" abstract="true">
        <property name="name" value="nsccwx"/>
        <property name="address" value="江苏无锡"/>
        <property name="company" ref="company"/>
    </bean>

    <bean id="liwl" class="com.liwl.dev.LiwanLiangImpl" parent="comp"/>
    <bean id="school" class="com.liwl.dev.SchoolImpl" parent="comp"/>


</beans>

LiwlTest.java

package com.liwl.dev;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class LiwlTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springdi.xml");
        LiwanLiangImpl liwl = (LiwanLiangImpl) context.getBean("liwl");
        SchoolImpl sch = (SchoolImpl) context.getBean("school");
        System.out.println(liwl);
        System.out.println(sch);
        context.close();
    }
}

运行结果

[LiwanLiangImpl bean info]
name:nsccwx
address:江苏无锡
company:[CompanyImpl bean info]
name:null
address:null
[SchoolImpl bean info]
name:nsccwx
address:江苏无锡
company:[CompanyImpl bean info]
name:null
address:null

总结:

能够看到LiwanLiangImpl和SchoolImpl已经被注入了CompanyImpl的bean的初始值

修改springdi.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/context 
        https://www.springframework.org/schema/context/spring-context.xsd">


    <bean id="company" class="com.liwl.dev.CompanyImpl">
        <property name="name" value="nsccwx"/>
        <property name="address" value="江苏无锡"/>
    </bean>

    <bean id="comp" abstract="true">
        <property name="company" ref="company"/>
    </bean>

    <bean id="liwl" class="com.liwl.dev.LiwanLiangImpl" parent="comp">
        <property name="name" value="liwl"></property>
        <property name="address" value="江苏无锡liwl"></property>
    </bean>

    <bean id="school" class="com.liwl.dev.SchoolImpl" parent="comp">
        <property name="name" value="school"/>
        <property name="address" value="江苏无锡school"/>
    </bean>


</beans>

运行结果

[LiwanLiangImpl bean info]
name:liwl
address:江苏无锡liwl
company:[CompanyImpl bean info]
name:nsccwx
address:江苏无锡
[SchoolImpl bean info]
name:school
address:江苏无锡school
company:[CompanyImpl bean info]
name:nsccwx
address:江苏无锡

修改springdi.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/context 
        https://www.springframework.org/schema/context/spring-context.xsd">


    <bean id="company" class="com.liwl.dev.CompanyImpl">
        <property name="name" value="nsccwx"/>
        <property name="address" value="江苏无锡"/>
    </bean>

    <bean id="comp" abstract="true">
        <property name="name" value="liwl"></property>
        <property name="company" ref="company"/>
    </bean>

    <bean id="liwl" class="com.liwl.dev.LiwanLiangImpl" parent="comp">
        <!-- 
        <property name="name" value="liwl"></property>
        -->
        <property name="address" value="江苏无锡liwl"></property>

    </bean>

    <bean id="school" class="com.liwl.dev.SchoolImpl" parent="comp">
        <property name="name" value="school"/>
        <property name="address" value="江苏无锡school"/>
    </bean>


</beans>

总结:

LiwanLiangImpl和SchoolImpl在通过abstractparent引入bean模板时,也可以通过property标签,自定义属性值,且优先级大于模板,能够覆盖属性值

posted @ 2022-02-24 15:12  liwl1991  阅读(255)  评论(0编辑  收藏  举报