Note: The JIRA issue for this work is FCREPO-648
Fedora's original Server and Module classes were designed in 2002, and provided a common way for major functional components ("modules") of the repository to be plugged in, configured, initialized, and stopped. Problems with the existing framework include:
Use standard, well-known frameworks/libraries to:
This work will NOT attempt to:
These capabilities may be added in the future, possibly with the help of OSGi.
After analyzing the available options, we have selected the Spring framework, version 3.
Popular frameworks that support the dependency injection pattern include Spring, PicoContainer, and Guice.
How do they compare? Several articles have been written comparing Spring and Guice, as well as all three. As many have pointed out, Spring and Guice are more than DI frameworks. For our purposes, we considered the attributes of each that are most relevant to the problem at hand:
|
Spring |
PicoContainer |
Guice |
---|---|---|---|
Supports start/stop lifecycle hooks for components |
Yes (interface, JSR-250 @PostConstruct/@PreDestroy annotations, spring-specific annotation, or xml-configured) |
Yes (interface or JSR-250 @PostConstruct/@PreDestroy annotations) |
|
Supports autowiring |
Yes |
Yes |
Yes |
Supports in-code wiring and configuration |
Yes (JavaConfig) |
Yes |
Yes |
Supports external wiring (outside of code) |
Yes (xml) |
No |
Not directly (but it's possible) |
Supports external config (outside of code) |
Yes (xml and/or properties) |
No |
Yes (Names.bindProperties) |
OSGi-Friendly |
Yes (Spring-DM) |
Unknown |
Yes (Guice-Peaberry) |
JSR-330 Support |
|||
Jar Footprint (non-OSGi) |
750kb |
300kb |
650kb |
Spring was selected because:
View presentation from March 16th, 2010 Special Topic Meeting
Modify existing modules to accept injected dependencies and config values
||Completed||Priority||Locked||CreatedDate||CompletedDate||Assignee||Name|| |F|M|F|1268080202735| |cwilper|Add and populate GlobalConfig| |F|M|F|1268080236272| |cwilper|Update org.fcrepo.server.access.DefaultAccess| |F|M|F|1268080257979| |cwilper|Update org.fcrepo.server.access.DynamicAccessModule| |F|M|F|1268080268001| |cwilper|Update org.fcrepo.server.journal.Journaler| |F|M|F|1268080276055| |cwilper|Update org.fcrepo.server.management.BasicPIDGenerator| |F|M|F|1268080285519| |cwilper|Update org.fcrepo.server.management.ManagementModule| |F|M|F|1268080327906| |cwilper|Update org.fcrepo.server.messaging.MessagingModule| |F|M|F|1268080339553| |cwilper|Update org.fcrepo.server.oai.FedoraOAIProviderModule| |F|M|F|1268080350944| |cwilper|Update org.fcrepo.server.resourceIndex.ResourceIndexModule| |F|M|F|1268080374403| |cwilper|Update org.fcrepo.server.search.FieldSearchSQLModule| |F|M|F|1268080381223| |cwilper|Update org.fcrepo.server.security.DefaultAuthorization| |F|M|F|1268080399963| |cwilper|Update org.fcrepo.server.security.DefaultBackendSecurity| |F|M|F|1268080425721| |cwilper|Update org.fcrepo.server.storage.ConnectionPoolManagerImpl| |F|M|F|1268080433280| |cwilper|Update org.fcrepo.server.storage.DefaultDOManager| |F|M|F|1268080461067| |cwilper|Update org.fcrepo.server.storage.DefaultExternalContentManager| |F|M|F|1268082094738| |cwilper|Update org.fcrepo.server.storage.lowlevel.akubra.AkubraLowlevelStorageModule| |F|M|F|1268082154104| |nigel thomas|Update org.fcrepo.server.storage.lowlevel.DefaultLowlevelStorageModule| |F|M|F|1268082165864| |cwilper|Update org.fcrepo.server.storage.translation.DOTranslationModule| |F|M|F|1268082180490| |cwilper|Update org.fcrepo.server.validation.DOValidatorModule| |