From 25e546e02435c2d727d4e1a29fd13eae7060cb93 Mon Sep 17 00:00:00 2001 From: fujiayang Date: Fri, 8 Apr 2022 14:28:53 +0800 Subject: [PATCH] =?UTF-8?q?spring=E5=A2=9E=E5=BC=BA=E6=8A=BD=E8=B1=A1?= =?UTF-8?q?=E5=B7=A5=E5=8E=82=EF=BC=8C=E7=BB=A7=E6=89=BF=E6=94=B9=E7=BB=84?= =?UTF-8?q?=E5=90=88=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/after/FactoryConfig.java | 27 +++++++++++++ .../spring/after/FormDataHandlerFactory.java | 14 ------- .../after/FormItemConverterFactory.java | 15 -------- ...ategyFactory.java => StrategyFactory.java} | 38 ++++++++----------- 4 files changed, 42 insertions(+), 52 deletions(-) create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FactoryConfig.java delete mode 100644 src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormDataHandlerFactory.java delete mode 100644 src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormItemConverterFactory.java rename src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/{AbstractStrategyFactory.java => StrategyFactory.java} (55%) diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FactoryConfig.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FactoryConfig.java new file mode 100644 index 0000000..4aecb28 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FactoryConfig.java @@ -0,0 +1,27 @@ +package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormDataHandler; +import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormItemConverter; +import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormItemTypeEnum; + +/** + * TODO: + * + * @author F嘉阳 + * @date 2022/4/8 14:26 + */ +@Configuration +public class FactoryConfig { + + @Bean + public StrategyFactory formDataHandlerFactory() { + return new StrategyFactory<>(FormDataHandler.class); + } + + @Bean + public StrategyFactory formItemConverterFactory() { + return new StrategyFactory<>(FormItemConverter.class); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormDataHandlerFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormDataHandlerFactory.java deleted file mode 100644 index 86fed4a..0000000 --- a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormDataHandlerFactory.java +++ /dev/null @@ -1,14 +0,0 @@ -package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after; - -import org.springframework.stereotype.Component; -import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormDataHandler; - -/** - * TODO: - * - * @author F嘉阳 - * @date 2022/4/8 14:14 - */ -@Component -public class FormDataHandlerFactory extends AbstractStrategyFactory { -} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormItemConverterFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormItemConverterFactory.java deleted file mode 100644 index b709deb..0000000 --- a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/FormItemConverterFactory.java +++ /dev/null @@ -1,15 +0,0 @@ -package top.fjy8018.designpattern.pattern.creational.factorymethod.spring.after; - -import org.springframework.stereotype.Component; -import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormItemConverter; -import top.fjy8018.designpattern.pattern.creational.factorymethod.spring.bean.FormItemTypeEnum; - -/** - * TODO: - * - * @author F嘉阳 - * @date 2022/4/8 14:17 - */ -@Component -public class FormItemConverterFactory extends AbstractStrategyFactory { -} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/AbstractStrategyFactory.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/StrategyFactory.java similarity index 55% rename from src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/AbstractStrategyFactory.java rename to src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/StrategyFactory.java index 111e109..ae14b39 100644 --- a/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/AbstractStrategyFactory.java +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/factorymethod/spring/after/StrategyFactory.java @@ -6,8 +6,6 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; import java.util.Collection; import java.util.Map; @@ -17,12 +15,23 @@ import java.util.Map; * @author F嘉阳 * @date 2022/4/8 13:42 */ -public abstract class AbstractStrategyFactory> implements InitializingBean, ApplicationContextAware { +public class StrategyFactory> implements InitializingBean, ApplicationContextAware { private Map strategyMap; private ApplicationContext appContext; + private final Class strategyType; + + /** + * 创建一个策略工厂 + * + * @param strategyType 策略的类型 + */ + public StrategyFactory(Class strategyType) { + this.strategyType = strategyType; + } + /** * 根据策略 id 获得对应的策略的 Bean * @@ -36,13 +45,14 @@ public abstract class AbstractStrategyFactory> implemen @Override public void afterPropertiesSet() throws Exception { // 获取 Spring 容器中,所有 S 类型的 Bean - Collection strategies = appContext.getBeansOfType(getStrategyType()).values(); + Collection strategies = appContext.getBeansOfType(strategyType).values(); strategyMap = Maps.newHashMapWithExpectedSize(strategies.size()); - // 将所有 S 类型的 Bean 放入到 strategyMap 中 + // 将 所有 S 类型的 Bean 放入到 strategyMap 中 for (final S strategy : strategies) { T id = strategy.getId(); + strategyMap.put(id, strategy); } } @@ -51,22 +61,4 @@ public abstract class AbstractStrategyFactory> implemen public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { appContext = applicationContext; } - - /** - * 通过反射获取策略的类型 - * - * @return 策略的类型 - */ - protected Class getStrategyType() { - // getClass 获取当前运行时实例的类,getGenericSuperclass 获得泛型父类 - Type superclass = getClass().getGenericSuperclass(); - ParameterizedType pt = (ParameterizedType) superclass; - Type[] actualTypeArguments = pt.getActualTypeArguments(); - // 获得索引为 1 的实际参数类型,即第二个实际参数的类型 - Type actualTypeArgument = actualTypeArguments[1]; - @SuppressWarnings("unchecked") - Class result = (Class) actualTypeArgument; - - return result; - } }