You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2010/05/01 10:56:41 UTC
svn commit: r939949 - in /cayenne/main/trunk: docs/doc/src/main/resources/
framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/
framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/spi/
framework/cayenne-di-unpublished/...
Author: aadamchik
Date: Sat May 1 08:56:40 2010
New Revision: 939949
URL: http://svn.apache.org/viewvc?rev=939949&view=rev
Log:
CAY-1424 DI: support for named service injection and flexible map/list binding
* switching default object scope in DI registry from NO_SCOPE to SINGLETON
Modified:
cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/Binder.java
cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/BindingBuilder.java
cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/spi/Binding.java
cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/spi/DefaultInjector.java
cayenne/main/trunk/framework/cayenne-di-unpublished/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorScopeTest.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/CayenneServerModule.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/web/CayenneWebModule.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/web/ServletContextHandlerTest.java
cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java
Modified: cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=939949&r1=939948&r2=939949&view=diff
==============================================================================
--- cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt Sat May 1 08:56:40 2010
@@ -36,6 +36,7 @@ CAY-1394 DI-based replacement for JNDI h
CAY-1415 Replace WebApplicationContextFilter with a DI-enabled filter
CAY-1419 File-based ResourceLocator to replace legacy FileConfiguration
CAY-1422 Convert EventManager to an interface, make it injectable
+CAY-1424 DI: support for named service injection and flexible map/list binding
Bug Fixes Since 3.0:
Modified: cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/Binder.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/Binder.java?rev=939949&r1=939948&r2=939949&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/Binder.java (original)
+++ cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/Binder.java Sat May 1 08:56:40 2010
@@ -20,7 +20,10 @@ package org.apache.cayenne.di;
/**
* An object passed to a {@link Module} by the DI container during initialization, that
- * provides the API for the module to bind its services to the container.
+ * provides the API for the module to bind its services to the container. Note that the
+ * default {@link Scope} of the bound objects is normally "singleton" and can be changed
+ * to "no scope" or a custom scope via a corresponding method of a binding builder. E.g.
+ * see {@link BindingBuilder#in(Scope)}.
*
* @since 3.1
*/
Modified: cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/BindingBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/BindingBuilder.java?rev=939949&r1=939948&r2=939949&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/BindingBuilder.java (original)
+++ cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/BindingBuilder.java Sat May 1 08:56:40 2010
@@ -38,5 +38,10 @@ public interface BindingBuilder<T> {
BindingBuilder<T> toProviderInstance(Provider<? extends T> provider)
throws ConfigurationException;
+ /**
+ * Sets the scope of a bound instance. This method is used to change the default scope
+ * (which is normally {@link Scopes#SINGLETON}) to something else, e.g.
+ * {@link Scopes#NO_SCOPE}.
+ */
void in(Scope scope);
}
Modified: cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/spi/Binding.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/spi/Binding.java?rev=939949&r1=939948&r2=939949&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/spi/Binding.java (original)
+++ cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/spi/Binding.java Sat May 1 08:56:40 2010
@@ -33,9 +33,9 @@ class Binding<T> {
private Provider<T> unscoped;
private Provider<T> scoped;
- Binding(Provider<T> provider) {
+ Binding(Provider<T> provider, Scope initialScope) {
this.unscoped = provider;
- this.scoped = provider;
+ this.scoped = initialScope != null ? initialScope.scope(provider) : provider;
}
void changeScope(Scope scope) {
Modified: cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/spi/DefaultInjector.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/spi/DefaultInjector.java?rev=939949&r1=939948&r2=939949&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/spi/DefaultInjector.java (original)
+++ cayenne/main/trunk/framework/cayenne-di-unpublished/src/main/java/org/apache/cayenne/di/spi/DefaultInjector.java Sat May 1 08:56:40 2010
@@ -38,9 +38,13 @@ public class DefaultInjector implements
private Map<Key<?>, Binding<?>> bindings;
private InjectionStack injectionStack;
+ private Scope defaultScope;
public DefaultInjector(Module... modules) throws ConfigurationException {
+ // this is intentionally hardcoded and is not configurable
+ this.defaultScope = Scopes.SINGLETON;
+
this.bindings = new HashMap<Key<?>, Binding<?>>();
this.injectionStack = new InjectionStack();
@@ -74,7 +78,7 @@ public class DefaultInjector implements
<T> void putBinding(Key<T> bindingKey, Provider<T> provider) {
// TODO: andrus 11/15/2009 - report overriding existing binding??
- bindings.put(bindingKey, new Binding<T>(provider));
+ bindings.put(bindingKey, new Binding<T>(provider, defaultScope));
}
<T> void changeBindingScope(Key<T> bindingKey, Scope scope) {
Modified: cayenne/main/trunk/framework/cayenne-di-unpublished/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorScopeTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-di-unpublished/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorScopeTest.java?rev=939949&r1=939948&r2=939949&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-di-unpublished/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorScopeTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-di-unpublished/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorScopeTest.java Sat May 1 08:56:40 2010
@@ -28,7 +28,7 @@ import org.apache.cayenne.di.mock.MockIn
public class DefaultInjectorScopeTest extends TestCase {
- public void testNoScope() {
+ public void testDefaultScope() {
Module module = new Module() {
@@ -47,12 +47,11 @@ public class DefaultInjectorScopeTest ex
assertNotNull(instance2);
assertNotNull(instance3);
- assertNotSame(instance1, instance2);
- assertNotSame(instance2, instance3);
- assertNotSame(instance3, instance1);
+ assertSame(instance1, instance2);
+ assertSame(instance2, instance3);
}
- public void testNoScope_Explicit() {
+ public void testNoScope() {
Module module = new Module() {
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/CayenneServerModule.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/CayenneServerModule.java?rev=939949&r1=939948&r2=939949&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/CayenneServerModule.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/CayenneServerModule.java Sat May 1 08:56:40 2010
@@ -94,47 +94,41 @@ public class CayenneServerModule impleme
.add(new PostgresSniffer())
.add(new MySQLSniffer());
- binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class).in(
- Scopes.SINGLETON);
+ binder.bind(AdhocObjectFactory.class).to(DefaultAdhocObjectFactory.class);
binder.bind(ConfigurationNameMapper.class).to(
- DefaultConfigurationNameMapper.class).in(Scopes.SINGLETON);
+ DefaultConfigurationNameMapper.class);
- binder.bind(EventManager.class).toProvider(EventManagerProvider.class).in(
- Scopes.SINGLETON);
+ binder.bind(EventManager.class).toProvider(EventManagerProvider.class);
// a service to provide the main stack DataDomain
- binder.bind(DataDomain.class).toProvider(DataDomainProvider.class).in(
- Scopes.SINGLETON);
+ binder.bind(DataDomain.class).toProvider(DataDomainProvider.class);
// will return DataDomain for request for a DataChannel
- binder.bind(DataChannel.class).toProvider(DomainDataChannelProvider.class).in(
- Scopes.SINGLETON);
+ binder.bind(DataChannel.class).toProvider(DomainDataChannelProvider.class);
- binder.bind(ObjectContext.class).toProvider(DataContextProvider.class);
+ binder.bind(ObjectContext.class).toProvider(DataContextProvider.class).in(
+ Scopes.NO_SCOPE);
// a service to load project XML descriptors
binder.bind(DataChannelDescriptorLoader.class).to(
- XMLDataChannelDescriptorLoader.class).in(Scopes.SINGLETON);
+ XMLDataChannelDescriptorLoader.class);
// a service to load DataMap XML descriptors
- binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class).in(Scopes.SINGLETON);
+ binder.bind(DataMapLoader.class).to(XMLDataMapLoader.class);
// a locator of resources, such as XML descriptors
- binder.bind(ResourceLocator.class).to(ClassLoaderResourceLocator.class).in(
- Scopes.SINGLETON);
+ binder.bind(ResourceLocator.class).to(ClassLoaderResourceLocator.class);
// a global properties object
- binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class).in(
- Scopes.SINGLETON);
+ binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
// a service to load DataSourceFactories
binder.bind(DataSourceFactoryLoader.class).to(
- DefaultDataSourceFactoryLoader.class).in(Scopes.SINGLETON);
+ DefaultDataSourceFactoryLoader.class);
// a default SchemaUpdateStrategy (used when no explicit strategy is specified in
// XML)
- binder.bind(SchemaUpdateStrategy.class).to(SkipSchemaUpdateStrategy.class).in(
- Scopes.SINGLETON);
+ binder.bind(SchemaUpdateStrategy.class).to(SkipSchemaUpdateStrategy.class);
// a default DBAdapterFactory used to load custom and automatic DbAdapters
binder.bind(DbAdapterFactory.class).to(DefaultDbAdapterFactory.class);
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/web/CayenneWebModule.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/web/CayenneWebModule.java?rev=939949&r1=939948&r2=939949&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/web/CayenneWebModule.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/web/CayenneWebModule.java Sat May 1 08:56:40 2010
@@ -20,6 +20,7 @@ package org.apache.cayenne.configuration
import org.apache.cayenne.di.Binder;
import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.Scopes;
/**
* @since 3.1
@@ -27,6 +28,7 @@ import org.apache.cayenne.di.Module;
public class CayenneWebModule implements Module {
public void configure(Binder binder) {
- binder.bind(RequestHandler.class).to(SessionContextRequestHandler.class);
+ binder.bind(RequestHandler.class).to(SessionContextRequestHandler.class).in(
+ Scopes.NO_SCOPE);
}
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/web/ServletContextHandlerTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/web/ServletContextHandlerTest.java?rev=939949&r1=939948&r2=939949&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/web/ServletContextHandlerTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/configuration/web/ServletContextHandlerTest.java Sat May 1 08:56:40 2010
@@ -25,6 +25,7 @@ import org.apache.cayenne.di.Binder;
import org.apache.cayenne.di.DIBootstrap;
import org.apache.cayenne.di.Injector;
import org.apache.cayenne.di.Module;
+import org.apache.cayenne.di.Scopes;
import com.mockrunner.mock.web.MockHttpServletRequest;
import com.mockrunner.mock.web.MockHttpServletResponse;
@@ -39,7 +40,8 @@ public class ServletContextHandlerTest e
Module module = new Module() {
public void configure(Binder binder) {
- binder.bind(ObjectContext.class).to(MockObjectContext.class);
+ binder.bind(ObjectContext.class).to(MockObjectContext.class).in(
+ Scopes.NO_SCOPE);
}
};
Injector injector = DIBootstrap.createInjector(module);
Modified: cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java?rev=939949&r1=939948&r2=939949&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java (original)
+++ cayenne/main/trunk/framework/cayenne-project-unpublished/src/main/java/org/apache/cayenne/project2/CayenneProjectModule.java Sat May 1 08:56:40 2010
@@ -20,7 +20,6 @@ package org.apache.cayenne.project2;
import org.apache.cayenne.di.Binder;
import org.apache.cayenne.di.Module;
-import org.apache.cayenne.di.Scopes;
import org.apache.cayenne.project2.upgrade.ProjectUpgrader;
import org.apache.cayenne.project2.upgrade.v6.ProjectUpgrader_V6;
import org.apache.cayenne.project2.validation.DefaultProjectValidator;
@@ -35,14 +34,11 @@ import org.apache.cayenne.project2.valid
public class CayenneProjectModule implements Module {
public void configure(Binder binder) {
- binder.bind(ProjectLoader.class).to(DataChannelProjectLoader.class).in(
- Scopes.SINGLETON);
- binder.bind(ProjectSaver.class).to(FileProjectSaver.class).in(Scopes.SINGLETON);
- binder.bind(ProjectUpgrader.class).to(ProjectUpgrader_V6.class).in(
- Scopes.SINGLETON);
- binder.bind(ProjectValidator.class).to(DefaultProjectValidator.class).in(
- Scopes.SINGLETON);
+ binder.bind(ProjectLoader.class).to(DataChannelProjectLoader.class);
+ binder.bind(ProjectSaver.class).to(FileProjectSaver.class);
+ binder.bind(ProjectUpgrader.class).to(ProjectUpgrader_V6.class);
+ binder.bind(ProjectValidator.class).to(DefaultProjectValidator.class);
binder.bind(ConfigurationNodeParentGetter.class).to(
- DefaultConfigurationNodeParentGetter.class).in(Scopes.SINGLETON);
+ DefaultConfigurationNodeParentGetter.class);
}
}