Spring框架的绝大部分工作是对bean的管理,包括管理bean的生命周期、使用bean继承功能。
抽象bean与子bean
为了防止太多十分类似的bean出现在xml中,我们使用抽象bean把共同的信息提取出来,使用abstract属性标记为true。它不能被实例化,意义只是被继承,是个模板。子bean可以继承抽象bean的实现类,构造器参数,属性配置信息。子bean可增加新的信息也可覆盖父bean。子bean通过parent属性指定父bean的名字。与java继承相比,bean继承的bean的类型可以完全不懂,是实例之间的关系,继承的是属性参数值。
<bean id="steelAxe" class="com.cm.SteelAxe" /> <bean id="father" class="com.cm.Person" abstract="true" > <property name="name" value="a axe"/> <property name="axe" ref="stellAxe"/> </bean> <bean id="chinese" parent="father"/>
容器中的工厂bean
上一节中我们说的静态工厂与实力工厂无需实现或继承任何东西。而这里的工厂bean需要实现FactoryBean接口,它是一种特殊的bean。这个接口是工厂bean的标准接口。如果使用getBean返回工厂bean,那么返回的不是这个实例,而是它的产品。生产产品的方法就是它的getObject方法。
public class myfactory implements FactoryBean<Object> { private String targetClass; public String getTargetClass() { return targetClass; } public void setTargetClass(String targetClass) { this.targetClass = targetClass; } public String getTargetField() { return targetField; } public void setTargetField(String targetField) { this.targetField = targetField; } private String targetField; @Override public Object getObject() throws Exception { // TODO Auto-generated method stub Class<?> clazz = Class.forName(targetClass); java.lang.reflect.Field field = clazz.getField(targetField); return field.get(null); } @Override public Class<?> getObjectType() { // TODO Auto-generated method stub return Object.class; } @Override public boolean isSingleton() { // TODO Auto-generated method stub return false; } }
如上所示代码中,两个属性是在xml中配置的,getObject方法能够返回一个特定的实例。spring架构会在一开始扫描所有bean,如果发现哪个bean实现了FactoryBean接口,那么好了,架构会使用它的getObject方法得到一个实例(其实不单独理解为实例,而是那个方法的任意返回值)存放到容器中作为对应id的实例,而不是直接new一个这个类的实例。在使用ctx.getBean的时候,直接用id返回生成的实例。如果名字加个&,则直接返回FactoryBean本身。
获得bean本身的id
通过BeanNameAware接口能够提前预知该bean的配置id。此接口的setBeanName的name参数就是该bean的id,所谓id实际上就是一个String的,既可以理解为id,也可以理解为name。
import org.springframework.beans.factory.BeanNameAware; public class gethisid implements BeanNameAware { private String beanName; @Override public void setBeanName(String arg0) { // TODO Auto-generated method stub this.beanName = arg0; } public void info() { System.out.println(beanName); } }
Spring又来自动检测了,好累啊,如果发现哪个bean实现了BeanNameAware接口,那么好了,创建这个bean后,马上就调用setBeanName方法把id存起来。而所谓的得到id,指的是从容器中取出来,存到某个bean的成员变量。不过很少有机会需要用到bean的配置id。
强制初始化bean
当某些bean中的依赖关系特别复杂时,我们可以使用depends-on属性来制定它依赖哪一个bean,这样,就会先实例化那个bean,再来处理这个bean,防止出错。如果被依赖的bean还没实例化,就出错了。
本文出自 “指尖轻飞” 博客,谢绝转载!
原文地址:http://mengcao.blog.51cto.com/9395052/1690621