文档章节

spring BeanFactory

52iSilence7
 52iSilence7
发布于 2014/12/29 21:34
字数 613
阅读 51
收藏 1

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

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

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

        下面是错误代码:

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文件:

<?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>



        运行之后报错

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类型。

        且看代码:

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代理出来的。


© 著作权归作者所有

共有 人打赏支持
52iSilence7
粉丝 5
博文 83
码字总数 61112
作品 0
海淀
高级程序员
私信 提问
bean创建过程、spring BeanFactory的实现、spring aware

Bean的创建过程: Spring beanFactory的工厂模式实现: 解析标签,存到一个Map beans中 People o = (People)factory.getBean("p"); 因为map存的是object类型,所以取出时需要强制类型转换 ...

sun_tantan
2018/08/09
0
0
在spring中如何配置和使用一个Bean

在Spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中...

冰雷卡尔
2012/07/24
0
0
三条路线告诉你如何掌握Spring IoC容器的核心原理

一、前言 前三篇已经从历史的角度和大家一起探讨了为什么会有Spring,Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国。本节的主要目的就是通过一个切入点带大家一...

Java小铺
2018/08/27
0
0
Spring中ApplicationContext和beanfactory区别

org.springframework.beans及org.springframework.context包是Spring IoC容器的基础。BeanFactory提供的高级配置机制,使得管理任何性质的对象成为可能。ApplicationContext是BeanFactory的扩...

ArlenXu
2015/01/18
0
0
Spring(一)——总体介绍

工作闲着,快速回顾一下spring框架。Spring框架,是进行对象管理,对象关联,解耦的一个中间层框架。SSH(Struts+Spring+Hibernate)三大Spring在中间就起着一个承上启下的作用。好,首先我们...

凡尘里的一根葱
2015/11/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

导出表格

https://blog.csdn.net/hhzzcc_/article/details/80419396

Js_Mei
19分钟前
0
0
Ubuntu中安装Elasticsearch

1.安装jre elasticsearch是使用java开发的搜索引擎,因此其运行依赖于java runtime environment,我们在这里不使用Oracel的官方jre,改为使用open-jre。 运行环境: ubuntu:18.04 jre:openj...

cloes
36分钟前
0
0
nginx rails 详细站点配置入门教程

Ruby on Rails 是一个用于开发数据库驱动的网络应用程序的完整框架。Rails基于MVC(模型- 视图- 控制器)设计模式。从视图中的Ajax应用,到控制器中的访问请求和反馈,到封装数据库的模型,R...

xiangyunyan
今天
4
0
Shiro

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

嘿嘿嘿IT
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部