From 992afe54e72f721266e70c982ce6ee35d7b4cd0a Mon Sep 17 00:00:00 2001 From: fangjian0423 Date: Mon, 14 Jan 2019 21:00:17 +0800 Subject: [PATCH] refactor sentinel DataSourceHandler --- .../custom/SentinelAutoConfiguration.java | 6 ++- .../custom/SentinelDataSourceHandler.java | 47 +++++++------------ 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java index 8e6f8db8..98bd17b2 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelAutoConfiguration.java @@ -22,6 +22,7 @@ import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -165,8 +166,9 @@ public class SentinelAutoConfiguration { } @Bean - public SentinelDataSourceHandler sentinelDataSourceHandler() { - return new SentinelDataSourceHandler(); + public SentinelDataSourceHandler sentinelDataSourceHandler( + DefaultListableBeanFactory beanFactory) { + return new SentinelDataSourceHandler(beanFactory); } protected static class SentinelConverterConfiguration { diff --git a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelDataSourceHandler.java b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelDataSourceHandler.java index d73996e2..31f8f8dc 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelDataSourceHandler.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelDataSourceHandler.java @@ -1,9 +1,7 @@ package org.springframework.cloud.alibaba.sentinel.custom; import java.lang.reflect.Field; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -12,10 +10,10 @@ import java.util.TreeMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.cloud.alibaba.sentinel.SentinelConstants; import org.springframework.cloud.alibaba.sentinel.SentinelProperties; import org.springframework.cloud.alibaba.sentinel.datasource.SentinelDataSourceConstants; @@ -24,7 +22,6 @@ import org.springframework.cloud.alibaba.sentinel.datasource.config.DataSourcePr import org.springframework.cloud.alibaba.sentinel.datasource.config.NacosDataSourceProperties; import org.springframework.cloud.alibaba.sentinel.datasource.converter.JsonConverter; import org.springframework.cloud.alibaba.sentinel.datasource.converter.XmlConverter; -import org.springframework.context.event.EventListener; import org.springframework.util.CollectionUtils; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; @@ -44,29 +41,28 @@ import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; * @see JsonConverter * @see XmlConverter */ -public class SentinelDataSourceHandler { +public class SentinelDataSourceHandler implements SmartInitializingSingleton { private static final Logger logger = LoggerFactory .getLogger(SentinelDataSourceHandler.class); private List dataTypeList = Arrays.asList("json", "xml"); - private List dataSourceBeanNameList = Collections - .synchronizedList(new ArrayList<>()); - private final String DATA_TYPE_FIELD = "dataType"; private final String CUSTOM_DATA_TYPE = "custom"; private final String CONVERTER_CLASS_FIELD = "converterClass"; + private DefaultListableBeanFactory beanFactory; + + public SentinelDataSourceHandler(DefaultListableBeanFactory beanFactory) { + this.beanFactory = beanFactory; + } + @Autowired private SentinelProperties sentinelProperties; - @EventListener(classes = ApplicationStartedEvent.class) - public void buildDataSource(ApplicationStartedEvent event) throws Exception { - - DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) event - .getApplicationContext().getAutowireCapableBeanFactory(); - + @Override + public void afterSingletonsInstantiated() { // commercialization if (!StringUtils.isEmpty(System.getProperties() .getProperty(SentinelDataSourceConstants.NACOS_DATASOURCE_ENDPOINT))) { @@ -101,9 +97,8 @@ public class SentinelDataSourceHandler { AbstractDataSourceProperties abstractDataSourceProperties = dataSourceProperties .getValidDataSourceProperties(); abstractDataSourceProperties.preCheck(dataSourceName); - registerBean(beanFactory, abstractDataSourceProperties, - dataSourceName + "-sentinel-" + validFields.get(0) - + "-datasource"); + registerBean(abstractDataSourceProperties, dataSourceName + + "-sentinel-" + validFields.get(0) + "-datasource"); } catch (Exception e) { logger.error("[Sentinel Starter] DataSource " + dataSourceName @@ -112,8 +107,7 @@ public class SentinelDataSourceHandler { }); } - private void registerBean(DefaultListableBeanFactory beanFactory, - final AbstractDataSourceProperties dataSourceProperties, + private void registerBean(final AbstractDataSourceProperties dataSourceProperties, String dataSourceName) { Map propertyMap = Arrays @@ -159,8 +153,8 @@ public class SentinelDataSourceHandler { // configuration and register String customConvertBeanName = "sentinel-" + dataSourceProperties.getConverterClass(); - if (!beanFactory.containsBean(customConvertBeanName)) { - beanFactory.registerBeanDefinition(customConvertBeanName, + if (!this.beanFactory.containsBean(customConvertBeanName)) { + this.beanFactory.registerBeanDefinition(customConvertBeanName, BeanDefinitionBuilder .genericBeanDefinition( Class.forName(dataSourceProperties @@ -209,9 +203,10 @@ public class SentinelDataSourceHandler { } }); - beanFactory.registerBeanDefinition(dataSourceName, builder.getBeanDefinition()); + this.beanFactory.registerBeanDefinition(dataSourceName, + builder.getBeanDefinition()); // init in Spring - AbstractDataSource newDataSource = (AbstractDataSource) beanFactory + AbstractDataSource newDataSource = (AbstractDataSource) this.beanFactory .getBean(dataSourceName); logAndCheckRuleType(newDataSource, dataSourceName, @@ -230,7 +225,6 @@ public class SentinelDataSourceHandler { DegradeRuleManager.register2Property(newDataSource.getProperty()); } } - dataSourceBeanNameList.add(dataSourceName); } private void logAndCheckRuleType(AbstractDataSource dataSource, String dataSourceName, @@ -278,9 +272,4 @@ public class SentinelDataSourceHandler { + ruleClass.getSimpleName() + ">. Class: " + ruleConfig.getClass()); } } - - public List getDataSourceBeanNameList() { - return dataSourceBeanNameList; - } - }