码迷,mamicode.com
首页 > 编程语言 > 详细

Spring笔记——5.深入理解容器中的Bean

时间:2015-09-02 02:09:32      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:spring   bean   

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还没实例化,就出错了。

本文出自 “指尖轻飞” 博客,谢绝转载!

Spring笔记——5.深入理解容器中的Bean

标签:spring   bean   

原文地址:http://mengcao.blog.51cto.com/9395052/1690621

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!