日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java基础(1)-几种获取类的扩展方式

發布時間:2023/12/18 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java基础(1)-几种获取类的扩展方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要

在日常開發過程中經常需要獲取類的擴展集。即獲取類的子類集(抽象類),或者接口實現類。比如說狀態模式中,狀態構建類,策略模式中的,策略構造方式。本文介紹幾種獲取方式。

實現

以策略模式為例
定義了2種策略

@Getter @AllArgsConstructor public enum StrategyEnum {APPROVE(1),REFUSE(2);private final int code; }

interface Handle,實現類ApproveHandle、RefuseHandle

方式1 Spring大法好

Spring為java web開發提供了很多便捷,這么剛需的需求,Spring當然可以搞定
ListableBeanFactory 擴展了FactoryBean,自然能夠獲取bean的定義,所以可以從ApplicationContext獲取類的擴展類

public static <T> Map<String, T> getBeansOfType(final Class<T> type) {if (applicationContext != null) {final ListableBeanFactory listableBeanFactory = applicationContext;return listableBeanFactory.getBeansOfType(type);}return null;}

方式2 還是Spring

Spring提供了很多的擴展,允許我們在初始化bean之前,之后做一些自定義邏輯。當然也可以在Spring裝配整個過程完成后做一些注入的邏輯

@Service public class InstanceBySpring implements InstanceFactory, InitializingBean {private static Map<StateEnum, AbstractState> map = new HashMap<>();private static Map<StrategyEnum, Handle> mapStrategy = new HashMap<>();@Autowiredprivate List<AbstractState> states;@Autowiredprivate List<Handle> handles;// 加載完了處理自己的邏輯@Overridepublic void afterPropertiesSet() throws Exception {if (!CollectionUtils.isEmpty(states)) {map = states.stream().collect(Collectors.toMap(v -> v.getCode(), Function.identity()));}if (!CollectionUtils.isEmpty(handles)) {mapStrategy = handles.stream().collect(Collectors.toMap(v -> v.getStrateType(), Function.identity()));}}@Overridepublic AbstractState getStateInstance(final StateEnum stateEnum) {return map.get(stateEnum);}@Overridepublic Handle getStrategyInstance(final StrategyEnum strategyEnum) {return mapStrategy.get(strategyEnum);} }

方式3 能不能不用Spring

離了Spring還能不能活,當然可以了。jdk本身提供了擴展支持ServiceLoader類。

  • META-INF/services配置類
  • ServiceLoader.load
  • public class InstanceByServiceLoader implements InstanceFactory {private final ServiceLoader<AbstractState> abstractStateServiceLoader = ServiceLoader.load(AbstractState.class);private final ServiceLoader<Handle> handleServiceLoader = ServiceLoader.load(Handle.class);@Overridepublic AbstractState getStateInstance(final StateEnum stateEnum) {final List<AbstractState> result = new ArrayList<>();for (final AbstractState state : abstractStateServiceLoader) {result.add(state);}return result.stream().collect(Collectors.toMap(p -> p.getCode(), Function.identity())).get(stateEnum);} }

    總結

    這邊是以接口類來介紹的,對于接口也同樣適用。完整代碼見github

    關注公眾號【方丈的寺院】,第一時間收到文章的更新,與方丈一起開始技術修行之路

    轉載于:https://www.cnblogs.com/stoneFang/p/11099576.html

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的java基础(1)-几种获取类的扩展方式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。