package com.taobao.easyweb.core.bean; import com.taobao.easyweb.core.app.App; import com.taobao.easyweb.core.app.change.AppChangeAdapter; import com.taobao.easyweb.core.context.ThreadContext; import com.taobao.easyweb.core.groovy.groovyobject.EasywebClassLoader; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; @Component("ewBeanFactory") public class BeanFactory extends AppChangeAdapter implements ApplicationContextAware, InitializingBean { private static ApplicationContext applicationContext; private static Map<String, Map<String, Object>> beans = new HashMap<String, Map<String, Object>>(); @Autowired(required = false) private LocalBean localBean; public static Object getSpringBean(String beanName) { return applicationContext.getBean(beanName); } public static Object getSpringBean(String beanName, Class<?> beanType) { Object obj = null; try { obj = getSpringBean(beanName); } catch (Exception e) { } if (obj != null) { return obj; } Map map = applicationContext.getBeansOfType(beanType); if (map.containsKey(beanName)) { return map.get(beanName); } if (!map.isEmpty()) { return map.values().iterator().next(); } return null; } public static void regist(App app, String name, Object bean) { /** * ����easyweb classloader���صģ������ؽ�bean���� */ ClassLoader classLoader = bean.getClass().getClassLoader(); if (!(classLoader instanceof EasywebClassLoader)) { return; } EasywebClassLoader easywebClassLoader = (EasywebClassLoader) classLoader; if (easywebClassLoader.isWeb()) {//��web��classloader��Ҳ��ע��bean return; } Map<String, Object> appBeans = getAppBeans(app.getAppKey()); appBeans.put(name, bean); } public static Object getBean(String name) { // Object obj = getAppBeans(ThreadContext.getContext().getApp().getAppKey()).get(name); // if (obj.getClass().isAnnotationPresent(Bean.class)) { // Bean bean = obj.getClass().getAnnotation(Bean.class); // if (!bean.singleton()) { // // } // } return getAppBeans(ThreadContext.getContext().getApp().getAppKey()).get(name); } public static Object getAppBean(String appKey, String beanName) { Map<String, Object> appBeans = getAppBeans(appKey); return appBeans.get(beanName); } private static Map<String, Object> getAppBeans(String appKey) { Map<String, Object> appBeans = beans.get(appKey); if (appBeans == null) { appBeans = new HashMap<String, Object>(); beans.put(appKey, appBeans); } if (!"local".equals(appKey)) { appBeans.putAll(getAppBeans("local")); } return appBeans; } public static Map<String, Object> getBeans(App app) { String key = app == null ? "local" : app.getAppKey(); return getAppBeans(key); } public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { BeanFactory.applicationContext = applicationContext; } @Override public void remove(App app) { beans.remove(app.getAppKey()); } @Override public void stop(App app) { beans.remove(app.getAppKey()); } @Override public void afterPropertiesSet() throws Exception { if (localBean == null) { return; } if (localBean.getAllLocalBeans()) { for (String bean : applicationContext.getBeanDefinitionNames()) { try { Object obj = applicationContext.getBean(bean); getAppBeans("local").put(bean, obj); } catch (Throwable e) { } } } else if (localBean.getLocalBeans() != null && !localBean.getLocalBeans().isEmpty()) { for (Map.Entry<String, String> entry : localBean.getLocalBeans().entrySet()) { try { Object obj = applicationContext.getBean(entry.getValue()); if (obj != null) { getAppBeans("local").put(entry.getKey(), obj); } } catch (Exception e) { } } } } }