📜  Spring-Bean定义继承(1)

📅  最后修改于: 2023-12-03 15:20:13.747000             🧑  作者: Mango

Spring Bean定义继承

在Spring框架中,Bean定义继承是一种通过一个父Bean定义创建子Bean定义的机制。子Bean继承了父Bean的配置信息,可以覆盖或者添加额外的配置。

1. 定义父Bean

使用XML或注解方式定义父Bean,可以包含属性、构造函数参数、初始化方法等配置。

@Configuration
public class ParentBeanConfig {

    @Bean
    public ParentBean parentBean() {
        ParentBean parentBean = new ParentBean();
        parentBean.setName("Parent Bean");
        parentBean.setAge(30);
        return parentBean;
    }
}
2. 定义子Bean

子Bean可以继承父Bean的属性值,同时可以添加或者修改一些属性。

@Configuration
public class ChildBeanConfig {

    @Bean
    public ChildBean childBean() {
        ChildBean childBean = new ChildBean();
        childBean.setName("Child Bean");
        childBean.setAge(20);
        childBean.setChildProperty("Child property");
        return childBean;
    }
}
3. 配置继承关系

使用parent属性指定父Bean名称,子Bean继承父Bean的全部属性。

@Configuration
public class AppConfig {

    @Bean
    public ParentBean parentBean() {
        // 父Bean配置
    }

    @Bean
    public ChildBean childBean() {
        ChildBean childBean = new ChildBean();
        childBean.setName("Child Bean");
        childBean.setAge(20);
        childBean.setChildProperty("Child property");
        return childBean;
    }
}
4. 获取子Bean

可以通过依赖注入或者使用ApplicationContext获取子Bean实例。

@Autowired
private ChildBean childBean;

或者

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
ChildBean childBean = context.getBean(ChildBean.class);
5. 子Bean覆盖父Bean属性

子Bean可以覆盖父Bean的属性值,如果没有指定,则继承父Bean的属性值。

@Configuration
public class AppConfig {

    @Bean
    public ParentBean parentBean() {
        // 父Bean配置
    }

    @Bean
    public ChildBean childBean() {
        ChildBean childBean = new ChildBean();
        childBean.setName("Child Bean");
        childBean.setAge(20);
        childBean.setChildProperty("Child property");
        return childBean;
    }
}
6. 子Bean添加新属性

子Bean可以添加新的属性,不会影响父Bean的属性。

@Configuration
public class AppConfig {

    @Bean
    public ParentBean parentBean() {
        // 父Bean配置
    }

    @Bean
    public ChildBean childBean() {
        ChildBean childBean = new ChildBean();
        childBean.setName("Child Bean");
        childBean.setAge(20);
        childBean.setChildProperty("Child property");
        childBean.setAdditionalProperty("Additional property");
        return childBean;
    }
}

通过Spring Bean定义继承,可以方便地重用和扩展已有的Bean定义,提高代码的可维护性和重复利用率。

注意:以上示例以JavaConfig方式进行示范,XML配置方式也适用相同的概念。