1
14
15 package com.liferay.portal.spring.annotation;
16
17 import com.liferay.portal.kernel.annotation.BeanReference;
18 import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
19
20 import java.lang.reflect.Field;
21
22 import java.util.HashMap;
23 import java.util.Map;
24
25 import org.springframework.beans.BeansException;
26 import org.springframework.beans.factory.BeanCreationException;
27 import org.springframework.beans.factory.BeanFactory;
28 import org.springframework.beans.factory.BeanFactoryAware;
29 import org.springframework.beans.factory.NoSuchBeanDefinitionException;
30 import org.springframework.beans.factory.config.BeanPostProcessor;
31 import org.springframework.util.ReflectionUtils;
32
33
40 public class BeanReferenceAnnotationBeanPostProcessor
41 implements BeanFactoryAware, BeanPostProcessor {
42
43 public Object postProcessAfterInitialization(Object bean, String beanName)
44 throws BeansException {
45
46 return bean;
47 }
48
49 public Object postProcessBeforeInitialization(Object bean, String beanName)
50 throws BeansException {
51
52 _autoInject(bean, beanName, bean.getClass());
53
54 return bean;
55 }
56
57 public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
58 _beanFactory = beanFactory;
59 }
60
61 private void _autoInject(
62 Object targetBean, String targetBeanName, Class<?> beanClass) {
63
64 if ((beanClass == null) || beanClass.isInterface()) {
65 return;
66 }
67
68 String className = beanClass.getName();
69
70 if (className.equals(_JAVA_LANG_OBJECT) ||
71 className.startsWith(_ORG_SPRINGFRAMEWORK)) {
72
73 return;
74 }
75
76 Field[] fields = beanClass.getDeclaredFields();
77
78 for (Field field : fields) {
79 BeanReference beanReference = field.getAnnotation(
80 BeanReference.class);
81
82 if (beanReference == null) {
83 continue;
84 }
85
86 String referencedBeanName = beanReference.name();
87
88 Class<?> referencedBeanType = beanReference.type();
89
90 if (!Object.class.equals(referencedBeanType)) {
91 referencedBeanName = referencedBeanType.getName();
92 }
93
94 Object referencedBean = _beans.get(referencedBeanName);
95
96 if (referencedBean == null) {
97 try {
98 referencedBean = _beanFactory.getBean(referencedBeanName);
99 }
100 catch (NoSuchBeanDefinitionException nsbde) {
101 referencedBean = PortalBeanLocatorUtil.locate(
102 referencedBeanName);
103 }
104
105 _beans.put(referencedBeanName, referencedBean);
106 }
107
108 ReflectionUtils.makeAccessible(field);
109
110 try {
111 field.set(targetBean, referencedBean);
112 }
113 catch (Throwable t) {
114 throw new BeanCreationException(
115 targetBeanName, "Could not inject BeanReference fields",
116 t);
117 }
118 }
119
120 _autoInject(targetBean, targetBeanName, beanClass.getSuperclass());
121
122 return;
123 }
124
125 private static String _JAVA_LANG_OBJECT = "java.lang.Object";
126
127 private static String _ORG_SPRINGFRAMEWORK = "org.springframework";
128
129 private BeanFactory _beanFactory;
130 private Map<String, Object> _beans = new HashMap<String, Object>();
131
132 }