Browse Source
git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@3191 50f2f4bb-b051-0410-bef5-90022cba6387pull/1/head
4 changed files with 203 additions and 46 deletions
@ -0,0 +1,95 @@
@@ -0,0 +1,95 @@
|
||||
/* |
||||
* Copyright 2002-2010 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.beans.factory.config; |
||||
|
||||
import java.io.Serializable; |
||||
import javax.inject.Provider; |
||||
|
||||
import org.springframework.beans.BeansException; |
||||
import org.springframework.beans.factory.BeanFactory; |
||||
import org.springframework.util.Assert; |
||||
|
||||
/** |
||||
* A {@link org.springframework.beans.factory.FactoryBean} implementation that |
||||
* returns a value which is a JSR-330 {@link javax.inject.Provider} that in turn |
||||
* returns a bean sourced from a {@link org.springframework.beans.factory.BeanFactory}. |
||||
* |
||||
* <p>This is basically a JSR-330 compliant variant of Spring's good old |
||||
* {@link ObjectFactoryCreatingFactoryBean}. It can be used for traditional |
||||
* external dependency injection configuration that targets a property or |
||||
* constructor argument of type <code>javax.inject.Provider</code>, as an |
||||
* alternative to JSR-330's <code>@Inject</code> annotation-driven approach. |
||||
* |
||||
* @author Juergen Hoeller |
||||
* @since 3.0.2 |
||||
* @see javax.inject.Provider |
||||
* @see ObjectFactoryCreatingFactoryBean |
||||
*/ |
||||
public class ProviderCreatingFactoryBean extends AbstractFactoryBean<Provider> { |
||||
|
||||
private String targetBeanName; |
||||
|
||||
|
||||
/** |
||||
* Set the name of the target bean. |
||||
* <p>The target does not <i>have</> to be a non-singleton bean, but realisticially |
||||
* always will be (because if the target bean were a singleton, then said singleton |
||||
* bean could simply be injected straight into the dependent object, thus obviating |
||||
* the need for the extra level of indirection afforded by this factory approach). |
||||
*/ |
||||
public void setTargetBeanName(String targetBeanName) { |
||||
this.targetBeanName = targetBeanName; |
||||
} |
||||
|
||||
@Override |
||||
public void afterPropertiesSet() throws Exception { |
||||
Assert.hasText(this.targetBeanName, "Property 'targetBeanName' is required"); |
||||
super.afterPropertiesSet(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Class getObjectType() { |
||||
return Provider.class; |
||||
} |
||||
|
||||
@Override |
||||
protected Provider createInstance() { |
||||
return new TargetBeanProvider(getBeanFactory(), this.targetBeanName); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Independent inner class - for serialization purposes. |
||||
*/ |
||||
private static class TargetBeanProvider implements Provider, Serializable { |
||||
|
||||
private final BeanFactory beanFactory; |
||||
|
||||
private final String targetBeanName; |
||||
|
||||
public TargetBeanProvider(BeanFactory beanFactory, String targetBeanName) { |
||||
this.beanFactory = beanFactory; |
||||
this.targetBeanName = targetBeanName; |
||||
} |
||||
|
||||
public Object get() throws BeansException { |
||||
return this.beanFactory.getBean(this.targetBeanName); |
||||
} |
||||
} |
||||
|
||||
} |
||||
@ -1,19 +1,24 @@
@@ -1,19 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> |
||||
|
||||
<!-- |
||||
Test data for ObjectFactoryCreatingFactoryBeanTests |
||||
--> |
||||
<beans> |
||||
|
||||
<bean id="prototypeTarget" class="java.util.Date" scope="prototype"/> |
||||
|
||||
<bean id="prototype" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean"> |
||||
<property name="targetBeanName"><idref local="prototypeTarget"/></property> |
||||
<bean id="prototypeFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean"> |
||||
<property name="targetBeanName" value="prototypeTarget"/> |
||||
</bean> |
||||
|
||||
<bean id="testBean" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBeanTests$TestBean"> |
||||
<property name="objectFactory"><ref local="prototype"/></property> |
||||
<bean id="factoryTestBean" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBeanTests$FactoryTestBean"> |
||||
<property name="objectFactory" ref="prototypeFactory"/> |
||||
</bean> |
||||
|
||||
|
||||
<bean id="prototypeProvider" class="org.springframework.beans.factory.config.ProviderCreatingFactoryBean"> |
||||
<property name="targetBeanName" value="prototypeTarget"/> |
||||
</bean> |
||||
|
||||
<bean id="providerTestBean" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBeanTests$ProviderTestBean"> |
||||
<property name="provider" ref="prototypeProvider"/> |
||||
</bean> |
||||
|
||||
</beans> |
||||
|
||||
Loading…
Reference in new issue