56efedc3f9281e560c93bbb9e1f91c2e390f1f66
[utils] / support / spring / src / main / java / org / wamblee / general / spring / SpringBeanFactory.java
1 /*
2  * Copyright 2005 the original author or authors.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.wamblee.general.spring;
17
18 import org.springframework.beans.BeansException;
19 import org.springframework.beans.factory.access.BeanFactoryLocator;
20 import org.springframework.beans.factory.access.BeanFactoryReference;
21 import org.springframework.context.access.ContextSingletonBeanFactoryLocator;
22 import org.wamblee.general.BeanFactory;
23 import org.wamblee.general.BeanFactoryException;
24 import org.wamblee.general.BeanKernel;
25
26 /**
27  * Bean factory which uses Spring. This bean factory cannot be configured
28  * directly in the {@link org.wamblee.general.BeanKernel} because it does not
29  * provide a default no-arg constructor. Therefore, it must be delegated to or
30  * it must tbe subclassed to provide a default constructor.
31  */
32 public class SpringBeanFactory implements BeanFactory {
33
34     private BeanFactoryReference factoryReference;
35
36     /**
37      * Constructs the bean factory.
38      * 
39      * @param aSelector
40      *            Selector to find the appropriate bean ref context.
41      * @param aFactoryName
42      *            Spring bean factory to use.
43      */
44     public SpringBeanFactory(String aSelector, String aFactoryName) {
45         try {
46             BeanFactoryLocator locator = ContextSingletonBeanFactoryLocator
47                     .getInstance(aSelector);
48             factoryReference = locator.useBeanFactory(aFactoryName);
49         } catch (BeansException e) {
50             throw new BeanFactoryException(
51                     "Could not load bean factory: selector = '" + aSelector
52                             + "', factory = '" + aFactoryName + "'", e);
53         }
54     }
55
56     /*
57      * (non-Javadoc)
58      * 
59      * @see org.wamblee.general.BeanFactory#find(java.lang.String)
60      */
61     public Object find(String aId) {
62         return find(aId, Object.class);
63     }
64
65     /*
66      * (non-Javadoc)
67      * 
68      * @see org.wamblee.general.BeanFactory#find(java.lang.Class)
69      */
70     public <T> T find(Class<T> aClass) {
71         return find(aClass.getName(), aClass);
72     }
73
74     /*
75      * (non-Javadoc)
76      * 
77      * @see org.wamblee.general.BeanFactory#find(java.lang.String,
78      *      java.lang.Class)
79      */
80     public <T> T find(String aId, Class<T> aClass) {
81         try {
82             Object obj = factoryReference.getFactory().getBean(aId, aClass);
83             assert obj != null;
84             return aClass.cast(obj);
85         } catch (BeansException e) {
86             throw new BeanFactoryException(e.getMessage(), e);
87         }
88     }
89     
90     /**
91      * Gets the spring bean factory. 
92      * @return Spring bean factory. 
93      */
94     public org.springframework.beans.factory.BeanFactory getSpringBeanFactory() { 
95         return factoryReference.getFactory(); 
96     }
97
98 }