`

spring之FactoryBean接口

阅读更多
//该接口主要用于从spring中获取bean的时候如果实现了该接口会直接调用该接口中的getObject来获取bean
public interface FactoryBean<T> {

	T getObject() throws Exception;

	
	Class<?> getObjectType();

	
	boolean isSingleton();

}


/**
其在获取bean的时候判断是否实现了FactoryBean接口从这也可以看出如果一个类实现了FactoryBean接口但是我们想要返回他本身的实例,
我们可以在获取bean的时候在名字前面加&符号即可。
*/

protected Object getObjectForBeanInstance(
			Object beanInstance, String name, String beanName, RootBeanDefinition mbd) {

		
		if (BeanFactoryUtils.isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) {
			throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());
		}

		//判断是否实现了FactoryBean接口或者以&开头
		if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
			return beanInstance;
		}

		Object object = null;
		if (mbd == null) {
			object = getCachedObjectForFactoryBean(beanName);
		}
		if (object == null) {
			// Return bean instance from factory.
			FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
			// Caches object obtained from FactoryBean if it is a singleton.
			if (mbd == null && containsBeanDefinition(beanName)) {
				mbd = getMergedLocalBeanDefinition(beanName);
			}
			boolean synthetic = (mbd != null && mbd.isSynthetic());
			object = getObjectFromFactoryBean(factory, beanName, !synthetic);
		}
		return object;
	}

//这是从FactoryBean获取bean的代码
private Object doGetObjectFromFactoryBean(
			final FactoryBean<?> factory, final String beanName, final boolean shouldPostProcess)
			throws BeanCreationException {

		Object object;
		try {
			if (System.getSecurityManager() != null) {
				AccessControlContext acc = getAccessControlContext();
				try {
					object = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
						@Override
						public Object run() throws Exception {
								return factory.getObject();
							}
						}, acc);
				}
				catch (PrivilegedActionException pae) {
					throw pae.getException();
				}
			}
			else {
				object = factory.getObject();
			}
		}
		catch (FactoryBeanNotInitializedException ex) {
			throw new BeanCurrentlyInCreationException(beanName, ex.toString());
		}
		catch (Throwable ex) {
			throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
		}

		if (object == null && isSingletonCurrentlyInCreation(beanName)) {
			throw new BeanCurrentlyInCreationException(
					beanName, "FactoryBean which is currently in creation returned null from getObject");
		}

		if (object != null && shouldPostProcess) {
			try {
				object = postProcessObjectFromFactoryBean(object, beanName);
			}
			catch (Throwable ex) {
				throw new BeanCreationException(beanName, "Post-processing of the FactoryBean's object failed", ex);
			}
		}

		return object;
	}

分享到:
评论

相关推荐

    spring的FactoryBean增强我们的目标对象.rar

    在Spring框架中,`FactoryBean`是一个非常重要的接口,它允许我们自定义对象的创建方式。这个接口使得我们可以实现自己的工厂逻辑,返回一个完全初始化、配置好的对象,甚至可以是带有额外增强功能的对象,比如代理...

    Spring中BeanFactory与FactoryBean接口的区别详解

    **FactoryBean接口**则是一种特殊的Bean,它不是用来直接创建对象的,而是用来创建Bean的Bean。当你需要在Spring容器中创建更复杂、有特定初始化逻辑的对象时,可以使用FactoryBean。FactoryBean的实例本身就是一个...

    Spring中的FactoryBean.rar

    首先,FactoryBean接口是Spring框架的核心组件之一,位于`org.springframework.beans.factory`包下。该接口定义了两个主要方法: 1. `Object getObject() throws Exception;`:返回由FactoryBean创建的对象。Spring...

    spring源码解析之FactoryBean相关测试代码demo

    在Spring框架中,`FactoryBean`是一个非常关键的接口,它允许我们自定义对象的创建方式,这在处理复杂依赖关系或需要特殊初始化逻辑时尤为有用。本篇将通过一个测试代码示例来深入解析`FactoryBean`的工作原理及其在...

    spring中FactoryBean中的getObject()方法实例解析

    当我们调用 getBean("car") 时,Spring 将通过反射机制发现 CarFactoryBean 实现了 FactoryBean 的接口,然后调用其 getObject() 方法返回工厂类创建的对象。如果我们希望获取 CarFactoryBean 的实例,则需要在使用 ...

    SSH笔记-通过实现FactoryBean接口来创建 Bean

    在Spring框架中,`FactoryBean`接口是一个非常重要的组件,它允许我们自定义Bean的创建逻辑,这在处理复杂对象的实例化或者需要特定初始化步骤时尤其有用。本笔记将详细探讨如何通过实现`FactoryBean`接口来创建Bean...

    详解Spring中的FactoryBean

    在Spring框架中,`FactoryBean`是一个非常重要的接口,它为Spring容器提供了更高级别的抽象,使得我们可以自定义Bean的创建过程。当一个Bean的初始化需要处理复杂的逻辑、依赖其他多个Bean,或者需要进行特殊处理时...

    简单了解Spring中BeanFactory与FactoryBean的区别

    Spring框架中有两个非常关键的接口:BeanFactory和FactoryBean。虽然它们的名字相似,但它们的作用和实现机制却有很大的不同。 BeanFactory是Spring IoC容器的核心接口,它定义了getBean()、containsBean()等管理...

    spring中的FactoryBean代码示例

    在上面的示例中,我们实现了FactoryBean接口,并提供了getObject()方法来生成User对象。这样,我们可以通过getBean(id)方法获取User对象的实例,而不是UserFactory的实例。 FactoryBean的实现可以带来很多便捷,...

    FactoryBean代码最简实现

    当Spring容器遇到一个实现了`FactoryBean`接口的bean时,它不会直接调用`getBean()`方法来获取对象,而是调用`FactoryBean`的`getObject()`方法。这样,我们可以在`getObject()`方法中实现复杂的逻辑,如初始化、...

    spring如何通过FactoryBean配置Bean

    通过这个示例,我们可以看到 FactoryBean 的强大之处。它可以将复杂的实例化逻辑封装起来,使得 Bean 的配置更加灵活和灵活。同时,它还可以帮助我们实现单例模式,使得我们的应用程序更加高效和稳定。

    Spring BeanFactory和FactoryBean区别解析

    FactoryBean接口对应Spring框架来说占有重要的地位,Spring本身就提供了70多个FactoryBean的实现。他们隐藏了实例化一些复杂的细节,给上层应用带来了便利。从Spring3.0开始,FactoryBean开始支持泛型。 下面是一个...

    深入了解Spring中的FactoryBean

    BeanFactory是FactoryBean的基础,FactoryBean是建立在BeanFactory之上的。 三、FactoryBean的应用 FactoryBean的应用非常广泛,在复杂的业务系统中,FactoryBean可以用来创建和管理对象实例。例如,在一个电子...

    mybatis,mybatis-spring

    - MapperFactoryBean:实现了Spring的FactoryBean接口,为每个Mapper接口创建一个代理对象,调用Mapper接口的方法时,会自动执行对应的SQL。 4. **MyBatis-Spring的使用** - 配置:在Spring配置文件中添加...

    68-BeanFactory与FactoryBean1

    在 Spring 中,FactoryBean 是一个特殊的 Bean,它实现了 FactoryBean 接口,该接口提供了 getObject() 方法来返回实例化后的对象。当我们在配置文件中配置了 FactoryBean 时,getBean() 方法返回的对象实际上是 ...

    mybatis-spring-1.0.1-bundle.zip

    它扩展了 Spring 的 FactoryBean 接口,可以直接在 Spring 配置文件中声明,通过配置数据源、MyBatis 的配置文件等参数,轻松创建 SqlSessionFactory。 2. SqlSessionTemplate:这是一个线程安全的 SqlSession 实现...

    mybatis-spring-1.3.3.jar官方下载

    4. **MapperFactoryBean**:它是 Spring 的 FactoryBean,用于实例化 Mapper 接口并注入到 Spring 容器。这样,我们可以在 Spring 环境中通过 DAO 接口直接调用 SQL 方法,而无需关心实现细节。 5. **Transaction ...

    详细的Spring配置和Spring Boot-外文翻译

    FactoryBean接口提供了一种机制,使你可以轻松地将自定义工厂与Spring的BeanFactory接口集成。 4. **使用JavaBeans PropertyEditors**:PropertyEditor接口是java.beans包中提供的标准接口。PropertyEditors用于...

    mybatis-Spring整合jar包

    4. **MapperFactoryBean**:这个类是MyBatis-Spring提供的,它实现了Spring的FactoryBean接口,可以将Mapper接口实例化为Spring的bean,同时处理与SqlSession的交互。 5. **SqlSessionTemplate**和**...

    mybatis-spring-1.3.2

    2. **MapperFactoryBean**:该类实现了 Spring 的 FactoryBean 接口,用于生成指定类型的 Mapper 对象。通过这个工厂,我们可以在 Spring 容器中直接注入 Mapper 接口。 3. **TransactionAwareExecutor**:这是一个...

Global site tag (gtag.js) - Google Analytics