Переглянути джерело

1. fix cannot get bean bug. 2. fix aspectj not load bug

knightliao 9 роки тому
батько
коміт
323caafedb

+ 1 - 1
disconf-client/pom.xml

@@ -10,7 +10,7 @@
     <parent>
         <groupId>com.baidu.disconf</groupId>
         <artifactId>disconf-base</artifactId>
-        <version>2.6.29</version>
+        <version>2.6.30-SNAPSHOT</version>
     </parent>
 
     <licenses>

+ 22 - 1
disconf-client/src/main/java/com/baidu/disconf/client/DisconfMgrBean.java

@@ -8,11 +8,13 @@ import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
+import org.springframework.beans.factory.support.GenericBeanDefinition;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.core.Ordered;
 import org.springframework.core.PriorityOrdered;
 
+import com.baidu.disconf.client.store.aspect.DisconfAspectJ;
 import com.baidu.disconf.client.store.inner.DisconfCenterHostFilesStore;
 import com.baidu.disconf.client.utils.StringUtil;
 
@@ -49,7 +51,6 @@ public class DisconfMgrBean implements BeanDefinitionRegistryPostProcessor, Prio
      */
     @Override
     public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
-
     }
 
     /**
@@ -72,6 +73,9 @@ public class DisconfMgrBean implements BeanDefinitionRegistryPostProcessor, Prio
         // 进行扫描
         DisconfMgr.getInstance().setApplicationContext(applicationContext);
         DisconfMgr.getInstance().firstScan(scanPackList);
+
+        // register java bean
+        registerAspect(registry);
     }
 
     @Override
@@ -79,6 +83,23 @@ public class DisconfMgrBean implements BeanDefinitionRegistryPostProcessor, Prio
         this.applicationContext = applicationContext;
     }
 
+    /**
+     * register aspectJ for disconf get request
+     *
+     * @param registry
+     */
+    private void registerAspect(BeanDefinitionRegistry registry) {
+
+        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
+        beanDefinition.setBeanClass(DisconfAspectJ.class);
+        beanDefinition.setLazyInit(false);
+        beanDefinition.setAbstract(false);
+        beanDefinition.setAutowireCandidate(true);
+        beanDefinition.setScope("singleton");
+
+        registry.registerBeanDefinition("disconfAspectJ", beanDefinition);
+    }
+
     /*
      * 已经废弃了,不推荐使用
      */

+ 1 - 1
disconf-client/src/main/java/com/baidu/disconf/client/core/processor/impl/DisconfFileCoreProcessorImpl.java

@@ -200,7 +200,7 @@ public class DisconfFileCoreProcessorImpl implements DisconfCoreProcessor {
 
                 object = disconfCenterFile.getObject();
                 if (object == null) {
-                    object = registry.getFirstByType(disconfCenterFile.getCls());
+                    object = registry.getFirstByType(disconfCenterFile.getCls(), true);
                 }
 
             } catch (Exception e) {

+ 1 - 1
disconf-client/src/main/java/com/baidu/disconf/client/core/processor/impl/DisconfItemCoreProcessorImpl.java

@@ -174,7 +174,7 @@ public class DisconfItemCoreProcessorImpl implements DisconfCoreProcessor {
             //
             if (!Modifier.isStatic(field.getModifiers())) {
 
-                object = registry.getFirstByType(field.getDeclaringClass());
+                object = registry.getFirstByType(field.getDeclaringClass(), true);
             }
 
             disconfStoreProcessor.inject2Instance(object, key);

+ 9 - 0
disconf-client/src/main/java/com/baidu/disconf/client/support/registry/Registry.java

@@ -24,4 +24,13 @@ public interface Registry {
      * @return 可找到的Bean的实例列表
      */
     <T> T getFirstByType(Class<T> type);
+
+    /**
+     * 查找Bean, 是否找proxy
+     *
+     * @param type 类型
+     *
+     * @return 可找到的Bean的实例列表
+     */
+    <T> T getFirstByType(Class<T> type, boolean withProxy);
 }

+ 5 - 0
disconf-client/src/main/java/com/baidu/disconf/client/support/registry/impl/SimpleRegistry.java

@@ -44,4 +44,9 @@ public class SimpleRegistry implements Registry {
             return list.get(0);
         }
     }
+
+    @Override
+    public <T> T getFirstByType(Class<T> type, boolean withProxy) {
+        return getFirstByType(type, withProxy);
+    }
 }

+ 32 - 3
disconf-client/src/main/java/com/baidu/disconf/client/support/registry/impl/SpringRegistry.java

@@ -6,8 +6,9 @@ import java.util.Map;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.aop.framework.Advised;
+import org.springframework.aop.support.AopUtils;
 import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanFactoryUtils;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 
@@ -44,10 +45,11 @@ public class SpringRegistry implements Registry, ApplicationContextAware {
 
         Map<String, T> map = findByTypeWithName(type);
         if (map == null || map.isEmpty()) {
-            LOGGER.warn("Not found from Spring IoC container for " + type.getSimpleName() + ", and try to init by "
+            LOGGER.debug("Not found from Spring IoC container for " + type.getSimpleName() + ", and try to init by "
                     + "calling newInstance.");
             return simpleRegistry.findByType(type);
         }
+
         return new ArrayList<T>(map.values());
     }
 
@@ -60,6 +62,23 @@ public class SpringRegistry implements Registry, ApplicationContextAware {
         return list.get(0);
     }
 
+    @Override
+    public <T> T getFirstByType(Class<T> type, boolean withProxy) {
+
+        T object = getFirstByType(type);
+
+        if (!withProxy) {
+            return object;
+        }
+
+        try {
+            return getTargetObject(object, type);
+        } catch (Exception e) {
+            LOGGER.warn(e.toString());
+            return object;
+        }
+    }
+
     /**
      * 调用Spring工具类获取bean
      *
@@ -68,6 +87,16 @@ public class SpringRegistry implements Registry, ApplicationContextAware {
      * @return 容器托管的bean字典
      */
     public <T> Map<String, T> findByTypeWithName(Class<T> type) {
-        return BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, type);
+        return applicationContext.getBeansOfType(type);
+    }
+
+    protected <T> T getTargetObject(Object proxy, Class<T> targetClass) throws Exception {
+        if (AopUtils.isJdkDynamicProxy(proxy)) {
+            return (T) ((Advised) proxy).getTargetSource().getTarget();
+        } else if (AopUtils.isCglibProxy(proxy)) {
+            return (T) ((Advised) proxy).getTargetSource().getTarget();
+        } else {
+            return (T) proxy;
+        }
     }
 }

+ 1 - 1
disconf-core/pom.xml

@@ -13,7 +13,7 @@
     <parent>
         <groupId>com.baidu.disconf</groupId>
         <artifactId>disconf-base</artifactId>
-        <version>2.6.29</version>
+        <version>2.6.30-SNAPSHOT</version>
     </parent>
 
     <licenses>

+ 1 - 1
disconf-web/pom.xml

@@ -12,7 +12,7 @@
     <parent>
         <groupId>com.baidu.disconf</groupId>
         <artifactId>disconf-base</artifactId>
-        <version>2.6.29</version>
+        <version>2.6.30-SNAPSHOT</version>
     </parent>
 
     <dependencies>

+ 4 - 4
pom.xml

@@ -5,7 +5,7 @@
 
     <groupId>com.baidu.disconf</groupId>
     <artifactId>disconf-base</artifactId>
-    <version>2.6.29</version>
+    <version>2.6.30-SNAPSHOT</version>
     <packaging>pom</packaging>
 
     <modules>
@@ -25,9 +25,9 @@
 
     <properties>
         <!-- 模块版本号 -->
-        <disconf-core.version>2.6.29</disconf-core.version>
-        <disconf-client.version>2.6.29</disconf-client.version>
-        <disconf-client-spring.version>2.6.29</disconf-client-spring.version>
+        <disconf-core.version>2.6.30-SNAPSHOT</disconf-core.version>
+        <disconf-client.version>2.6.30-SNAPSHOT</disconf-client.version>
+        <disconf-client-spring.version>2.6.30-SNAPSHOT</disconf-client-spring.version>
 
         <!-- Spring項目配置 -->
         <encoding>UTF-8</encoding>