问题描述---为什么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配置的继承不是类的继承,它们之间没有任何关系。
转自:http://blog.csdn.net/zhangzeyuaaa/article/details/22583681