(no commit message)
[utils] / support / spring / src / main / java / org / wamblee / general / spring / SpringBeanFactory.java
1 /*
2  * Copyright 2005-2010 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.ioc.BeanFactory;
23 import org.wamblee.ioc.BeanFactoryException;
24
25 /**
26  * Bean factory which uses Spring. This bean factory cannot be configured
27  * directly in the {@link org.wamblee.general.BeanKernel} because it does not
28  * provide a default no-arg constructor. Therefore, it must be delegated to or
29  * it must tbe subclassed to provide a default constructor.
30  */
31 public class SpringBeanFactory implements BeanFactory {
32     private BeanFactoryReference factoryReference;
33
34     /**
35      * Constructs the bean factory.
36      * 
37      * @param aSelector
38      *            Selector to find the appropriate bean ref context.
39      * @param aFactoryName
40      *            Spring bean factory to use.
41      */
42     public SpringBeanFactory(String aSelector, String aFactoryName) {
43         try {
44             BeanFactoryLocator locator = ContextSingletonBeanFactoryLocator
45                 .getInstance(aSelector);
46             factoryReference = locator.useBeanFactory(aFactoryName);
47         } catch (BeansException e) {
48             throw new BeanFactoryException(
49                 "Could not load bean factory: selector = '" + aSelector +
50                     "', factory = '" + aFactoryName + "'", e);
51         }
52     }
53
54     /*
55      * (non-Javadoc)
56      * 
57      * @see org.wamblee.general.BeanFactory#find(java.lang.String)
58      */
59     public Object find(String aId) {
60         return find(aId, Object.class);
61     }
62
63     /*
64      * (non-Javadoc)
65      * 
66      * @see org.wamblee.general.BeanFactory#find(java.lang.Class)
67      */
68     public <T> T find(Class<T> aClass) {
69         return find(aClass.getName(), aClass);
70     }
71
72     /*
73      * (non-Javadoc)
74      * 
75      * @see org.wamblee.general.BeanFactory#find(java.lang.String,
76      * java.lang.Class)
77      */
78     public <T> T find(String aId, Class<T> aClass) {
79         try {
80             Object obj = factoryReference.getFactory().getBean(aId, aClass);
81             assert obj != null;
82
83             return aClass.cast(obj);
84         } catch (BeansException e) {
85             throw new BeanFactoryException(e.getMessage(), e);
86         }
87     }
88
89     /**
90      * Gets the spring bean factory.
91      * 
92      * @return Spring bean factory.
93      */
94     public org.springframework.beans.factory.BeanFactory getSpringBeanFactory() {
95         return factoryReference.getFactory();
96     }
97 }