springboot如何获取一个接口下的所有实体类(策略模式的使用)

springboot如何获取一个接口下的所有实体类(策略模式的使用)

第一种: 自定义注解加反射

//1.定义接口
public interface IStrategy {
    String getName();
}
//2.定义注解
public @interface StrategyAnnotation {
    String value();
}
//2.定义业务类
@StrategyAnnotation("mysql")
public class MysqlStrategy implements IStrategy {
    @Override
    public String getName() {
        return "mysql";
    }
}

@StrategyAnnotation("oracle")
public class OracleStrategy implements IStrategy{
    public String getName() {
        return "oracle";
    }
}

//3.定义工厂 org.reflection:reflections:0.9.11
public class StrategyContext {

    private static final StrategyContext NOTICE_SERVICE_FACTORY = new StrategyContext();

    /**
     * 获取实例(单例)
     *
     * @return类工厂
     */
    public static StrategyContext getInstance() {
        return NOTICE_SERVICE_FACTORY;
    }

    /**
     * 业务类映射
     */
    private static final Map<String, String> NOTICE_SERVICE_MAP = new HashMap<>();

    static {
        Reflections reflections = new Reflections(
                "所有实现类的包名");
        Set<Class<?>> classSet = reflections.getTypesAnnotatedWith(StrategyAnnotation.class);
        for (Class<?> clazz : classSet) {
            StrategyAnnotation noticeService = clazz.getAnnotation(StrategyAnnotation.class);
            NOTICE_SERVICE_MAP.put(noticeService.value(), clazz.getCanonicalName());
        }
    }

    public IStrategy create(String type) {
        String className = NOTICE_SERVICE_MAP.get(type);
        try {
            Class<?> clazz = Class.forName(className);
            Constructor<?> constructor = clazz.getConstructor(String.class);
            return (IStrategy) constructor.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
//4.使用
 IStrategy iStrategy = StrategyContext.getInstance().create("mysql");
 iStrategy.getName();

第二种: 依赖springbean的生命周期

//1.定义接口
public interface IStrategy {
    String getName();
}
//2.定义业务类
@ComponentScan("mysql")
public class MysqlStrategy implements IStrategy {
    @Override
    public String getName() {
        return "mysql";
    }
}

@ComponentScan("oracle")
public class OracleStrategy implements IStrategy{
    public String getName() {
        return "oracle";
    }
}
//3.定义springboot配置
@Configuration
public class StrategyContext implements ApplicationContextAware, InitializingBean {

    private static ApplicationContext applicationContext;

    public static Map<String, SliceService> map = new HashMap<>();


    @Override
    public void afterPropertiesSet() throws Exception {
        map = applicationContext.getBeansOfType(IStrategy.class);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        StrategyContext.applicationContext = applicationContext;
    }

    /**
     * 通过 type 获取 IStrategy
     * @param dsCode
     * @return IStrategy
     */
    public static IStrategy getStrategy(String type) {
        return map.get(type);
    }
}
//4.使用
 IStrategy iStrategy = StrategyContext.getStrategy("mysql");
 iStrategy.getName();

第三种:使用@AutoWird注入

//1.定义接口
public interface IStrategy {
    String getName();
}
//2.定义业务类
@ComponentScan("mysql")
public class MysqlStrategy implements IStrategy {
    @Override
    public String getName() {
        return "mysql";
    }
}

@ComponentScan("oracle")
public class OracleStrategy implements IStrategy{
    public String getName() {
        return "oracle";
    }
}
//3.Autowired注入
@Component
public class StrategyContext {
    @Autowired
    Map<String, IStrategy> iStrategyMap = new HashMap<>();

    public IStrategy getStrategy(String type) {
        return iStrategyMap.get(type);
    }
}
//4.使用
	@Autowired
    private StrategyContext strategyContext;
 	IStrategy iStrategy = strategyContext.getStrategy("mysql");
	iStrategy.getName();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值