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 @@ |
|||||||
|
/* |
||||||
|
* 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 @@ |
|||||||
<?xml version="1.0" encoding="UTF-8"?> |
<?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"> |
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> |
||||||
|
|
||||||
<!-- |
|
||||||
Test data for ObjectFactoryCreatingFactoryBeanTests |
|
||||||
--> |
|
||||||
<beans> |
<beans> |
||||||
|
|
||||||
<bean id="prototypeTarget" class="java.util.Date" scope="prototype"/> |
<bean id="prototypeTarget" class="java.util.Date" scope="prototype"/> |
||||||
|
|
||||||
<bean id="prototype" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean"> |
<bean id="prototypeFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean"> |
||||||
<property name="targetBeanName"><idref local="prototypeTarget"/></property> |
<property name="targetBeanName" value="prototypeTarget"/> |
||||||
</bean> |
</bean> |
||||||
|
|
||||||
<bean id="testBean" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBeanTests$TestBean"> |
<bean id="factoryTestBean" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBeanTests$FactoryTestBean"> |
||||||
<property name="objectFactory"><ref local="prototype"/></property> |
<property name="objectFactory" ref="prototypeFactory"/> |
||||||
</bean> |
</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> |
</beans> |
||||||
|
|||||||
Loading…
Reference in new issue