1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.sra;
20
21 import org.springframework.beans.factory.config.BeanDefinition;
22 import org.springframework.beans.factory.support.AbstractBeanDefinition;
23 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
24 import org.springframework.beans.factory.support.RootBeanDefinition;
25 import org.springframework.context.ApplicationListener;
26 import org.springframework.context.ConfigurableApplicationContext;
27
28 public final class ApplicationContextUtils {
29
30 public static <T> T getOrCreateBean(
31 final ConfigurableApplicationContext ctx,
32 final String actualClazz,
33 final Class<T> type) throws ClassNotFoundException {
34
35 T bean;
36 if (ctx.getBeanFactory().containsSingleton(actualClazz)) {
37 bean = type.cast(ctx.getBeanFactory().getSingleton(actualClazz));
38 } else {
39 if (ApplicationListener.class.isAssignableFrom(type)) {
40 RootBeanDefinition bd = new RootBeanDefinition(
41 Class.forName(actualClazz), AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false);
42 bd.setScope(BeanDefinition.SCOPE_SINGLETON);
43 ((BeanDefinitionRegistry) ctx.getBeanFactory()).registerBeanDefinition(actualClazz, bd);
44 bean = ctx.getBean(type);
45 } else {
46 bean = type.cast(ctx.getBeanFactory().
47 createBean(Class.forName(actualClazz), AbstractBeanDefinition.AUTOWIRE_BY_TYPE, false));
48 ctx.getBeanFactory().registerSingleton(actualClazz, bean);
49 }
50 }
51 return bean;
52 }
53
54 private ApplicationContextUtils() {
55
56 }
57 }