最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中的策略模式簡單實現(xiàn)與使用分析

 更新時間:2024年01月05日 08:47:59   作者:it_lihongmin  
這篇文章主要介紹了Spring中的策略模式簡單實現(xiàn)與使用分析,去初始化時除了?initMultipartResolver(上傳文件)沒有獲取?Properties?defaultStrategies;默認(rèn)策略,其他的八大件都會使用到策略模式,需要的朋友可以參考下

一、策略模式

策略模式的網(wǎng)上一搜索就會出現(xiàn)很多的說明,并且大多數(shù)的例子基本都來自《Head First設(shè)計模式》《大話設(shè)計模式》等,并且過于文字化的介紹總是讓本來簡單的事情更加復(fù)雜化。

所以還是直接上demo,方便理解。Head First上的策略模式例子稍微復(fù)雜一些,代碼比較多就不進(jìn)行展示了

這里可以寫一個最簡單的策略模式,也可以理解為Java多態(tài)。

1、 創(chuàng)建一個策略抽象

public abstract class AbstractStrategy {
 
    /**
     *  抽象的策略接口
     */
    abstract void algorithm();
}

2、策略的N中實現(xiàn)

public class StrategyImplOne extends AbstractStrategy {
    @Override
    void algorithm() {
        System.out.println("我實現(xiàn)了策略(一)的方法?。?!");
    }
}
public class StrategyImplTwo extends AbstractStrategy {
 
    @Override
    void algorithm() {
        System.out.println("我實現(xiàn)了策略(二)的方法?。?!");
    }
}

3、為策略的調(diào)用創(chuàng)建一個觸發(fā)容器(方法調(diào)用觸發(fā))

public class Context {
 
    private AbstractStrategy strategy;
 
    public Context(AbstractStrategy strategy) {
        this.strategy = strategy;
    }
 
    /**
     *  觸發(fā)策略執(zhí)行
     */
    public void strategyImpl() {
        strategy.algorithm();
    }
}

4、測試簡單的策略模式

public class StrategyTest {
    public static void main(String[] args) {
        // 執(zhí)行策略一
        new Context(new StrategyImplOne()).strategyImpl();
        // 執(zhí)行策略二
        new Context(new StrategyImplTwo()).strategyImpl();
    }
}

5、查看結(jié)果

我實現(xiàn)了策略(一)的方法?。。?/p>

我實現(xiàn)了策略(二)的方法?。?!

二、Spring中的策略模式

當(dāng)我們看完上一個策略模式的demo的時候發(fā)現(xiàn)并沒有什么用,或者我不知道自己在項目里面怎么進(jìn)行使用,所以可以看看別人的框架是怎么使用的,或者說看看好的源碼中是怎么使用的。

1、Spring MVC中 DispatcherServlet 使用策略模式

DispatcherServlet在進(jìn)行轉(zhuǎn)發(fā)前需要進(jìn)行傳說中的九大件的初始化,其中去初始化時除了initMultipartResolver(上傳文件)沒有獲取Properties defaultStrategies;默認(rèn)策略,其他的八大件都會使用到策略模式。

先看一下defaultStrategies為 java.util.Properties類型,定義如下:

public class Properties extends Hashtable<Object, Object> {
    // ***
}

流程梳理:

1、當(dāng)Web容器啟動時,ServletWebServerApplicationContext初始化會調(diào)用其refresh()方法,則會調(diào)用 DispatcherServlet的onRefresh方法

2、onRefresh方法 - >initStrategies方法 -> 初始化九大件

3、初始化時則會調(diào)用getDefaultStrategy方法。如下:

4、getDefaultStrategy實現(xiàn),就是去調(diào)用了Properties這個Hashtable的key對應(yīng)的value值,如下:

protected <T> T getDefaultStrategy(ApplicationContext context, Class<T> strategyInterface) {
        List<T> strategies = this.getDefaultStrategies(context, strategyInterface);
        if (strategies.size() != 1) {
            throw new BeanInitializationException("DispatcherServlet needs exactly 1 strategy for interface [" + strategyInterface.getName() + "]");
        } else {
            return strategies.get(0);
        }
    }
protected <T> List<T> getDefaultStrategies(ApplicationContext context, Class<T> strategyInterface) {
        String key = strategyInterface.getName();
        String value = defaultStrategies.getProperty(key);
        if (value == null) {
            return new LinkedList();
        } else {
            String[] classNames = StringUtils.commaDelimitedListToStringArray(value);
            List<T> strategies = new ArrayList(classNames.length);
            String[] var7 = classNames;
            int var8 = classNames.length;
 
            for(int var9 = 0; var9 < var8; ++var9) {
                String className = var7[var9];
 
                try {
                    Class<?> clazz = ClassUtils.forName(className, DispatcherServlet.class.getClassLoader());
                    Object strategy = this.createDefaultStrategy(context, clazz);
                    strategies.add(strategy);
                } catch (ClassNotFoundException var13) {
                    throw new BeanInitializationException("Could not find DispatcherServlet's default strategy class [" + className + "] for interface [" + key + "]", var13);
                } catch (LinkageError var14) {
                    throw new BeanInitializationException("Unresolvable class definition for DispatcherServlet's default strategy class [" + className + "] for interface [" + key + "]", var14);
                }
            }
 
            return strategies;
        }
    }

5、那么Properties的值在哪里添加進(jìn)去的呢,DispatcherServlet 的static靜態(tài)代碼塊中會看見,是用Spring的Resource將配置文件中的配置加載,設(shè)置到這個Map容器中的,如下:

static {
        try {
            ClassPathResource resource = new ClassPathResource("DispatcherServlet.properties", DispatcherServlet.class);
            defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
        } catch (IOException var1) {
            throw new IllegalStateException("Could not load 'DispatcherServlet.properties': " + var1.getMessage());
        }
    }

6、在看看 DispatcherServlet.properties 配置就明白了,就是九大件沒傳時的默認(rèn)值,其實也可以考慮用SPI機(jī)制實現(xiàn)(記得之前好像是不是有版本就是用SPI實現(xiàn)的)。

# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\
	org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
	org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

總結(jié)

web容器啟動,ServletWebServerApplicationContext的refresh方法間接調(diào)用到 DispatcherServlet的初始九大件方法, 其中八大件在沒有自定義實現(xiàn)的情況下,調(diào)用默認(rèn)的 配置。

而默認(rèn)配置則是在 DispatcherServlet的靜態(tài)代碼塊中,由Spring的ClassPathResource將配置文件DispatcherServlet.properties中的配置加載進(jìn)一個 Map容器中。

只待初始化九大件時,根據(jù)不同的九大件類型作為key,調(diào)用相應(yīng)的實現(xiàn)。

到此這篇關(guān)于Spring中的策略模式簡單實現(xiàn)與使用分析的文章就介紹到這了,更多相關(guān)Spring策略模式簡單實現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

博兴县| 张家口市| 香港 | 定南县| 永泰县| 南华县| 贡觉县| 增城市| 色达县| 左贡县| 和平县| 成安县| 射洪县| 云浮市| 邹城市| 兰溪市| 唐河县| 岗巴县| 高雄县| 光泽县| 石家庄市| 天全县| 若尔盖县| 论坛| 广州市| 民县| 福鼎市| 巧家县| 体育| 修文县| 安吉县| 乌拉特中旗| 东平县| 个旧市| 隆德县| 华坪县| 曲靖市| 康平县| 武穴市| 曲松县| 安塞县|