一、抽象bean与子bean
抽象bean解决了重复配置臃肿问题。
Spring中的bean继承:实例参数之间的延续;
子父bean之间可以是不同的类型,不具有多态性,子bean不能被父bean使用;
java继承:一般到特殊的细化,方法、属性的延续;
子类是特殊的父类。
抽象bean----为<bean.../>增加abstract="true",
Spring不会为抽象bean实例化,不用指定class
<!-- 指定abstract="true"定义抽象Bean -->
<bean id="personTemplate" abstract="true">
<property name="name" value="crazyit"/>
<property name="axe" ref="steelAxe"/>
</bean>
<!-- 通过指定parent属性指定下面Bean配置可从父Bean继承得到配置信息 -->
<bean id="chinese" class="org.crazyit.app.service.impl.Chinese" parent="personTemplate"/>
<bean id="american" class="org.crazyit.app.service.impl.American" parent="personTemplate"/>
后两个bean中没有配置property,但是继承了模板中的属性。
二、容器中的工厂bean(FactoryBean)
工厂bean必须实现FactoryBean接口。FactoryBean提供了3个方法:
- T getObject(): 返回工厂返回的实例
- Class<> getObjectType( ): 生成的实例的实现类
- boolean isSingleton( )
①实现了FactoryBean的工厂
package codeEETest;
import java.lang.reflect.*;
import org.springframework.beans.factory.FactoryBean;
public class GetFieldFactoryBean implements FactoryBean<Object>
{
private String targetClass;
private String targetField;
// targetClass的setter方法
public void setTargetClass(String targetClass)
{
this.targetClass = targetClass;
}
// targetField的setter方法
public void setTargetField(String targetField)
{
this.targetField = targetField;
}
// 返回工厂Bean所生产的产品
@Override
public Object getObject() throws Exception
{
Class<?> clazz = Class.forName(targetClass);
Field field = clazz.getField(targetField);
return field.get(null);
}
// 获取工厂Bean所生产的产品的类型
@Override
public Class<? extends Object> getObjectType()
{
return Object.class;
}
// 返回该工厂Bean所生成的产品是否为单例
@Override
public boolean isSingleton()
{
return false;
}
}
②xml
<!-- 下面配置相当于如下代码:
FactoryBean factory = new org.crazyit.app.factory.GetFieldFactoryBean();
factory.setTargetClass("java.sql.ResultSet");
factory.setTargetField("TYPE_SCROLL_SENSITIVE");
north = factory.getObject(); -->
<bean id="theValue" class="codeEETest.GetFieldFactoryBean">
<property name="targetClass" value="java.sql.ResultSet"/>
<property name="targetField" value="TYPE_SCROLL_SENSITIVE"/>
</bean>
③测试
public class SpringTest
{
public static void main(String[] args)throws Exception
{
ApplicationContext ctx = new
ClassPathXmlApplicationContext("codeEETest/beans.xml");
// 下面2行代码获取的FactoryBean的产品
System.out.println(ctx.getBean("theValue"));
// 下面代码可获取的FactoryBean本身
System.out.println(ctx.getBean("&theValue"));
}
}
1005
codeEETest.GetFieldFactoryBean@599aa2db