Spring bean定义继承

Spring bean定义继承

在 Spring Framework 中,bean 定义继承(bean 配置继承)是我们必须学习的一个宝贵的省时特性。如您所知,bean 定义只不过是 Spring IoC 容器根据详细信息创建我们的 bean 的配置。这些 bean 定义可以包含很多有用的配置,如构造函数参数、属性值、初始化方法等。

1、使用 Bean 定义继承,子 bean 定义从父配置继承配置。

2、Child 定义还可以根据需要覆盖值并添加其他配置。

3、是否在你的项目中使用它取决于程序员,但至少在我看来它可以节省很多重复的配置。

 

bean 配置继承示例

当您使用如下所示的基于 XML 的配置时,使用 parent 属性来指定父 bean 配置。

1、id 为 abstractAuthor 的 bean 是抽象配置,因为它具有 abstract="true"。 Spring 不会创建抽象 bean 的实例。

2、另一方面,id="bookAuthor" 的 bean 是从 abstractAuthor 继承 bean 配置的子 bean 配置。

3、parent="abstractAuthor" 表示父 bean。

bean-config.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.xsd">
	<bean id="abstractAuthor" abstract="true"
      class="basic.ioc.config.inheritance.Author">
  		<property name="name" value="author"/>
  		<property name="age" value="18"/>
		</bean>
		<bean id="bookAuthor" parent="abstractAuthor"
      class="basic.ioc.config.inheritance.BookAuthor">
  		<!-- override - age -->
  		<property name="age" value="20"/>
  		<property name="bookName" value="The Book"/>
	</bean>
</beans>

Author

package basic.ioc.config.inheritance;
import java.util.StringJoiner;
public abstract class Author {
  private String name;
  private Integer age;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Integer getAge() {
    return age;
  }
  public void setAge(Integer age) {
    this.age = age;
  }
  @Override
  public String toString() {
    return new StringJoiner(", ", Author.class.getSimpleName() + "[", "]")
        .add("name='" + name + "'")
        .add("age=" + age)
        .toString();
  }
}

BookAuthor

package basic.ioc.config.inheritance;
import java.util.StringJoiner;
public class BookAuthor extends Author {
  private String bookName;
  public String getBookName() {
    return bookName;
  }
  public void setBookName(String bookName) {
    this.bookName = bookName;
  }
  @Override
  public String toString() {
    return new StringJoiner(", ", BookAuthor.class.getSimpleName() + "[", "]")
        .add(super.toString())
        .toString();
  }
}

TestConfig

public class TestConfigInheritance {
  @Test
  public void testBeanConfigInheritance(){
  ApplicationContext aContext
      = new ClassPathXmlApplicationContext("bean-config.xml");
  Author author = aContext.getBean(Author.class);
  BookAuthor bookAuthor = aContext.getBean(BookAuthor.class);
  System.out.println(author);
  System.out.println(bookAuthor);
  }
}

输出:

BookAuthor[Author[name='author', age=20]]
BookAuthor[Author[name='author', age=20]]

输出打印 BookAuthor 两次,因为 Author 被声明为抽象类。

总结:

这是一个很小的概念,但在时间上会非常有用。如果您使用带有 @Configuration@Bean 等注释的基于 Java 的 IoC 配置,请创建单独的可重用函数并在 @Bean 配置中使用它。

 

版权声明:著作权归作者所有。

thumb_up 0 | star_outline 0 | textsms 0