前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring BeanFactory

spring BeanFactory

作者头像
Dylan Liu
发布2019-07-01 15:07:55
4760
发布2019-07-01 15:07:55
举报
文章被收录于专栏:dylanliudylanliu

spring 的BeanFactory包含了最基本的bean操作,像通过bean name 来获取bean,判断bean是否存在等等。这些可以具体去看,不详述,主要看看‘&’ 操作符。

‘&’操作符的作用在文中的描述是:如果一个Bean是一个FactoryBean的话,加上'&'符号可以得到FactoryBean本身,那什么是FactoryBean?

我原来以为像在XML中配置的factory-method中的那个Bean可以通过‘&’符号来得到,但是spring报告的错误明显告诉我不是这样的。

下面是错误代码:

代码语言:javascript
复制
public class FactoryBean {
	public static void main(String...strings){
		ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext();
		ac.setConfigLocation("factoryBean.xml");
		ac.refresh();
		String s=(String)ac.getBean("factoryBean");
		Object o=ac.getBean("&factoryBean");
		System.out.println(s);
		System.out.println(o instanceof FactoryBean);
	}
	public static String newInstance(){
		return new String("asdf");
	}
}

XML文件:

代码语言:javascript
复制
<?xml version="1.0" ?>
<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-3.1.xsd">
	<bean id="factoryBean" class="liufq.FactoryBean" factory-method="newInstance"></bean>
</beans>

运行之后报错

代码语言:javascript
复制
Exception in thread "main" org.springframework.beans.factory.BeanIsNotAFactoryException: Bean named 'factoryBean' must be of type [org.springframework.beans.factory.FactoryBean], but was actually of type [java.lang.String]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1420)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:248)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1098)
	at liufq.FactoryBean.main(FactoryBean.java:11)

看来FactoryBean不是每个bean都能当的,上网搜了一下发现,只有继承了spring给的接口org.springframework.beans.factory.FactoryBean<T>才能算是一个FactoryBean,也就是说,spring通过接口限定了工厂bean的条件,T就是在XML中配置后返回的bean类型。

且看代码:

代码语言:javascript
复制
public class FactoryBean implements org.springframework.beans.factory.FactoryBean<String>{
	public static void main(String...strings){
		ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext();
		ac.setConfigLocation("factoryBean.xml");
		ac.refresh();
		String s=(String)ac.getBean("factoryBean");
		Object o=ac.getBean("&factoryBean");
		System.out.println(s);
		System.out.println(o instanceof FactoryBean);
	}
	public static String newInstance(){
		return new String("asdf");
	}
	@Override
	public String getObject() throws Exception {
		// TODO Auto-generated method stub
		return "aaaa";
	}
	@Override
	public Class<?> getObjectType() {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public boolean isSingleton() {
		// TODO Auto-generated method stub
		return false;
	}

XML文件把factory-method去掉就行了,不去掉的话还是会报一样的错误,因为返回的类型是String,而不是FactoryBean通过getObject返回的实例。

那用FactoryBean有什么好处呢,原本Bean的生成交给了FactoryBean来代理,可以在bean的返回前做一些初始化工作,或者日志输出等有帮助的信息,而在bean初始化完成后也可以作相应的日志,资源等处理,使bean生成变得更加灵活,而且还可以配置bean的scope等信息。spring的aop功能before和after是可以用FactoryBean代理出来的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档