问题描述---为什么Bean配置需要能够继承?

在Spring Ico容器里配置Bean时,可能存在这样一种情况:多个Bean的配置有一部分是相同的,如果在每个Bean里都进行配置,就会显得很麻烦。

相同的配置往往有两种情况:1.多个Bean需要注入相同的Bean;2.多个<bean>元素的属性相同。

解决方案

将多个Bean相同的部分抽象为一个Bean,然后让这多个Bean继承它。

实现案例

class Dao{
	public void daoM(){
		System.out.println("doaM");
	}
}

class ServiceA {
	private Dao dao;
	
	public void setDao(Dao dao) {
		this.dao = dao;
	}

	public void serviceA_M(){
		dao.daoM();
	}
}

class ServiceB {
	private Dao dao;
	
	public void setDao(Dao dao) {
		this.dao = dao;
	}

	public void serviceB_M(){
		dao.daoM();
	}
}

Bean配置

<?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="dao" class="com.zzj.test.Dao"></bean>
      <bean id="service" abstract="true">
      	<property name="dao">
      		<ref bean="dao"/>
      	</property>
      </bean>
      <bean id="serviceA" class="com.zzj.test.ServiceA" parent="service"></bean>
      <bean id="serviceB" class="com.zzj.test.ServiceB" parent="service"></bean>
</beans>

注:抽象出来的bean并未指定class。

测试

public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		ServiceA serviceA = (ServiceA) context.getBean("serviceA");
		serviceA.serviceA_M();
		ServiceB serviceB = (ServiceB) context.getBean("serviceB");
		serviceB.serviceB_M();

	}

总结

父Bean可以作为配置模板,也可以作为Bean实例。不过,如果只想把父Bean作为不实例化的模板,那么必须把abstract属性设为true,这样spring将不会实例化这个Bean。

注意:

1.并不是所有在父<bean>元素里定义的属性都会被继承。例如,autowire和dependency-check属性就不能被继承。

2.Bean配置的继承不是类的继承,它们之间没有任何关系。


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐