Spring Framework源码:spring beans之BeanFactory

先来认识一下两个重要容器BeanFactory和ApplicationContext的类图:

接下来,我们挨个对出现的类做个介绍:

??public interface BeanFactory {
	String FACTORY_BEAN_PREFIX = "&";
	Object getBean(String name) throws BeansException;
	<T> T getBean(String name, Class<T> requiredType) throws BeansException;
	<T> T getBean(Class<T> requiredType) throws BeansException;
	Object getBean(String name, Object... args) throws BeansException;
	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
	boolean containsBean(String name);
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
	boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;
	String[] getAliases(String name);
}

BeanFactory基类,包括以下成员:

String FACTORY_BEAN_PREFIX = "&"; 一个常量成员,用来解引用一个FactoryBean实例,和区分又FactoryBean创建的一系列bean(解引用的含义可以参考C++编程

思想一书,这里不做介绍),例如一个FactoryBean A, 那么获取&A拿到的就是工厂而不是bean实例。

Object getBean(String name) throws BeansException; 按名字获取bean实例

<T> T getBean(String name, Class<T> requiredType) throws BeansException; 一个泛型方法,按名字和类类型的类获取bean实例。

<T> T getBean(Class<T> requiredType) throws BeansException;一个泛型方法,按类类型获取bean实例。

Object getBean(String name, Object... args) throws BeansException; 按名字和显示声明的参数来创建实例,注意显示声明的参数是用来创建原型的

<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

boolean containsBean(String name);bean工厂是否含有名为name的bean

boolean isSingleton(String name) throws NoSuchBeanDefinitionException;bean是否是单例

boolean isPrototype(String name) throws NoSuchBeanDefinitionException;bean是否是原型

boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;名为name的bean的类类型是否是targetType

String[] getAliases(String name);获取所有bean的所有依赖,详见spring的配置文件

接下来是它的主要的两个子接口之一HierarchicalBeanFactory,字面理解是分层Bean工厂,从提供的函数接口看是在BeanFactory的基础上增加了通向父容器的通道,但只能获取(父子容器,举例ApplicationContext是父容器,DispatcherServlet是子容器可以多个,子容器能get付容器从而访问其内容,反之则不行):

public interface HierarchicalBeanFactory extends BeanFactory {
	BeanFactory getParentBeanFactory();
	boolean containsLocalBean(String name);
}

BeanFactory getParentBeanFactory();获取父容器

boolean containsLocalBean(String name); 判断当前容器是否包含名为name的bean而忽略父容器里的bean。

以下是BeanFactory的另一个重要子接口ListableBeanFactory:

public interface ListableBeanFactory extends BeanFactory {
	boolean containsBeanDefinition(String beanName);
	int getBeanDefinitionCount();
	String[] getBeanDefinitionNames();
	String[] getBeanNamesForType(Class<?> type);
	String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
	<T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
	<T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
			throws BeansException;
	String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
	Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;
	<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
			throws NoSuchBeanDefinitionException;

}

官方解释说这个类用来枚举有xml定义的类,比如像XmlBeanFactory这样基于xml的BeanFactory。它只会查询通过自身这个渠道创建的bean而忽略其他渠道创建的(比如HierarchicalBeanFactory)。

时间: 2024-08-24 04:24:43

Spring Framework源码:spring beans之BeanFactory的相关文章

Spring IOC 源码简单分析 01 - BeanFactory

### 准备 ## 目标 了解 Spring IOC 的基础流程 ## 相关资源 Offical Doc:http://docs.spring.io/spring/docs/4.3.9.RELEASE/spring-framework-reference/htmlsingle/ Sample code:<https://github.com/gordonklg/study>,spring module 源码版本:Spring framework 4.3.9 ##测试代码 gordon.stud

Spring Framework源码(十三):SpringMVC之从ModelMap到页面渲染

SpringMVC在调用了Controller的方法后会返回ModelAndView对象,这个对象会被传回DispatcherServlet的doDispatch方法中.接下来再调用以下的方法渲染页面: processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); private void processDispatchResult(HttpServletRequest reque

[自编号1-2]将spring framework源码导入Spring Tool Suite中

先讲基本步骤,如下: 去GitHub中下载spring framework的源码,https://github.com/spring-projects/spring-framework/releases 下载3.2.X其中的一个版本; 安装Gradle软件,官网下载,解压即可,设置GRADLE_HOME,和PATH. 命令行中运行gradle -v,检查一下是否正确安装配置: 命令行中运行spring framework根目录下的import-into-eclipse.bat 连续两次回车,就可

Spring Framework源码(六):Spring AOP之解析标签

首先看下spring framework配置例子: <aop:config> <aop:aspect id="myaop" ref="log"> <aop:pointcut id="mycut" expression="execution(* cn.itcast.service..*.*(..))"/> <aop:before pointcut-ref="mycut"

spring framework源码下载并导入eclipse

工作后开始学习Javaspring,好多地方都不明白,工厂模式来管理bean,他是怎么管理的呢,于是想到了看源码,但是源码好难搞,下载下来了,不知从哪下手,花了很多时间,都没弄好,偶然在网上看到篇文章,这才搞定,拿出来分享.原文地址:http://blog.csdn.net/buyaore_wo/article/details/8977746 一. 准备工作 1.下载安装sts(springsource推荐使用), 毕竟人家的框架用他自家的ide是最好的,当然sts也是基本eclipse的, 下

Spring Framework源码(十):SpringMVC之文件上传

我们这一章讲SpringMVC中文件上传的应用,首先我们还是从DispatcherServlet这个核心分发器开始讲起: processedRequest = checkMultipart(request); 还记得上一章讲doDispatch这个方法时见过的方法吧?现在我们来分析下这个方法的具体解析过程: protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartExcepti

Spring源码解析——start from BeanFactory(一)

先来看一下我们学习Spring时候的ABC代码: BeanFactory beanFactory=new ClassPathXmlApplicationContext("applicationContext.xml"); UserManager userManager=(UserManager)beanFactory.getBean("UserManagerImpl"); userManager.add("dd","d");

曹工说Spring Boot源码(18)-- Spring AOP源码分析三部曲,终于快讲完了 (aop:config完整解析【下】)

写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean Definition到底是什么,咱们对着接口,逐个方法讲解 曹工说Spring Boot源码(3)-- 手动注册Bean Definition不比游戏好玩吗,我们来试一下 曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean de

看看Spring的源码——Bean加载过程

最近几天跟同事聊起Spring的一些问题,对一些地方有些疑问,趁这两天有点空,看看Spring的源码,了解下具体的实现细节.本文基于Spring 4.0.5版本. 首先Web项目使用Spring是通过在web.xml里面配置org.springframework.web.context.ContextLoaderListener初始化IOC容器的. <listener> <listener-class>org.springframework.web.context.ContextL