Spring-7.Bean继承与FactoryBean

一、抽象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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值