亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Play Framework IV 依賴注入(DI)

2019-11-06 06:07:26
字體:
來源:轉載
供稿:網友

1.Play框架依賴注入介紹

Play框架提供基于JSR 330的依賴注入。Play默認的JSR 330的實現是用Guice實現的,但是其它的JSR 330實現也可以用。

2.聲明依賴

如果你有個組件(例如Controller)需要依賴其它組件,那么你就可以通過使用@Inject注解來聲明。@Inject注解可以在屬性或者構造方法上使用。例如,注入一個屬性:

import javax.inject.*;import play.libs.ws.*;public class MyComponent {    @Inject WSClient ws;    // ...} 注意這些是實例變量,通常情況下注入一個靜態屬性是沒有意義的,因為它會失去封裝的意義。

另一個例子,注入一個構造方法:

import javax.inject.*;import play.libs.ws.*;public class MyComponent {    PRivate final WSClient ws;    @Inject    public MyComponent(WSClient ws) {        this.ws = ws;    }    // ...} 雖然屬性注入更短,但比較推薦使用構造方法注入的方式。這樣更可測試,由于在單元測試中你需要傳入所有的構造方法參數來創建一個對象實例,編譯器需要確保依賴存在。且由于沒有setter的存在,構造方法注入的方式也更易于理解。

3.組件的生命周期

依賴注入系統管理注入組件的生命周期,當需要時創建它們然后將其注入到其它組件中。以下是組件生命周期如何工作的介紹:

在任何時候,當某個組件被需要時就被創建。如果一個組件不止一次的被用到,默認情況下,將會創建多個組件實例。如果你只想創建一個該組件的單例,你需要用@Singleton注解將其標記為一個單例。實例在它們被需要時會懶加載。如果一個組件從來都未被其它組件使用,那么它根本不會被創建。這通常情況下是有意義的,但是在一些情況下,你希望組件被立即加載哪怕它們從未被使用。舉例來說,你可能要向一個遠端系統發送一個信息或者在系統啟動時預加載一個緩存。你可以通過使用eager binding的方式強制創建一個組件。實例不會被自動清理,除了正常的垃圾回收。當組件不再被引用時,將會被GC回收,但是Play框架不會做任何特殊的事情來關閉組件,例如close方法。無論如何,Play提供了一類叫做closeapplicationLifecycly的特殊的組件,你可以將其注冊進去以在系統停止的時候關閉它們。

4.單例

有時你或許想讓組件保持一些狀態,例如緩存或者一個連向外部資源的鏈接,或者一個創建成本很高的組件。在這些情況下,創建一個該組件的單例是非常重要的。這些需求可以通過使用@Singleton注解來實現。例如:

import javax.inject.*;@Singletonpublic class CurrentSharePrice {    private volatile int price;    public void set(int p) {        price = p;    }    public int get() {        return price;    }}

5.停止/清理

當Play框架關閉時,一些組件需要被清理,例如停止線程池。Play框架提供了ApplicationLifecycle組件來注冊這些需要在Play關閉時清理的組件:

import javax.inject.*;import play.inject.ApplicationLifecycle;import java.util.concurrent.Callable;import java.util.concurrent.CompletableFuture;@Singletonpublic class MessageQueueConnection { private final MessageQueue connection; @Inject public MessageQueueConnection(ApplicationLifecycle lifecycle) { connection = MessageQueue.connect(); lifecycle.addStopHook(() -> { connection.stop(); return CompletableFuture.completedFuture(null); }); } // ...}ApplicationLifecycle將會按與創建順序相反的順序來停止所有組件。這意味著任何你所依賴的組件都將會被安全的引用,因為你依賴它們,它們必須在你的組件創建之前被創建,且直到該組件停止為止才能被清理。

注意,確保每個注冊到銷毀機制中的組件一定要是單例。任何非單例都可能是一個內存泄漏的隱患,因為新的組件在創建時都會注冊到銷毀機制中。

6.提供自定義綁定

實踐證明,通過接口來定義一個組件是非常好的,好于直接注入實現類本身。這樣一來,你可以注冊不同的實現類。若你聲明的是接口,那這時依賴注入系統就需要知道需要在這個接口下綁定哪個實現類。最簡單的方式就是通過@ImplementedBy注解來綁定實現類。以下是實現方式:

import com.google.inject.ImplementedBy;@ImplementedBy(EnglishHello.class)public interface Hello {    String sayHello(String name);}
public class EnglishHello implements Hello {    public String sayHello(String name) {        return "Hello " + name;    }}

在一些更復雜的情況下,你可能想要提供更復雜的綁定,例如當一個接口下有許多實現類需要注入時,可以通過@Nmed注解來區別。在下例中,你可以實現一個Guice Module:

import com.google.inject.AbstractModule;import com.google.inject.name.Names;public class Module extends AbstractModule {    protected void configure() {        bind(Hello.class)                .annotatedWith(Names.named("en"))                .to(EnglishHello.class);        bind(Hello.class)                .annotatedWith(Names.named("de"))                .to(GermanHello.class);    }} 如果你調用了Module并且將其置于根目錄,它會自動地注冊到Play框架中。亦或,你想起一個其它名字或者將其放置到其它包中,你可以在application.conf文件中的play.modules.enabled清單中追加它的全類名:

play.modules.enabled += "modules.HelloModule" 你也可以禁用根目錄中Module的自動注冊,通過將其加到disabled modules中來實現:

play.modules.disabled += "Module"

7.可配置的綁定

有時你或許想在配置Guice綁定的時候讀取Play框架的Configuration或者使用一個ClassLoader。你可以通過將其加入到你的module構造方法中的方式獲取入口。

在下例中,Hello綁定需要讀取configuration文件中的內容。

import com.google.inject.AbstractModule;import com.google.inject.ConfigurationException;import com.google.inject.name.Names;import play.Configuration;import play.Environment;public class Module extends AbstractModule {    private final Environment environment;    private final Configuration configuration;    public Module(          Environment environment,          Configuration configuration) {        this.environment = environment;        this.configuration = configuration;    }    protected void configure() {        // Expect configuration like:        // hello.en = "myapp.EnglishHello"        // hello.de = "myapp.GermanHello"        Configuration helloConf = configuration.getConfig("hello");        // Iterate through all the languages and bind the        // class associated with that language. Use Play's        // ClassLoader to load the classes.        for (String l: helloConf.subKeys()) {            try {                String bindingClassName = helloConf.getString(l);                Class<? extends Hello> bindingClass =                  environment.classLoader().loadClass(bindingClassName)                  .asSubclass(Hello.class);                bind(Hello.class)                        .annotatedWith(Names.named(l))                        .to(bindingClass);            } catch (ClassNotFoundException e) {                throw new RuntimeException(e);            }        }    }}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久中精品2020中文| 日韩精品视频在线免费观看| 清纯唯美亚洲综合| 欧美日韩一区二区免费视频| 91久久国产婷婷一区二区| 成人黄色av网站| 欧美性猛交xxxx偷拍洗澡| 欧美激情手机在线视频| 亚洲成人黄色在线| 在线播放国产精品| 亚洲欧美日韩爽爽影院| 国产999在线观看| 国产国语刺激对白av不卡| 青草热久免费精品视频| 国产精品久久不能| 久久免费视频观看| 国产美女主播一区| 91国产高清在线| 欧美一区三区三区高中清蜜桃| 成人精品一区二区三区电影黑人| 色婷婷综合久久久久| 伊人精品在线观看| 色播久久人人爽人人爽人人片视av| 亚洲激情国产精品| 亚洲电影免费观看高清完整版在线| 色噜噜亚洲精品中文字幕| 精品无人区乱码1区2区3区在线| 成人午夜黄色影院| 性欧美办公室18xxxxhd| 日韩中文字幕视频在线观看| 一二美女精品欧洲| 国产精品久久久久9999| 久久成人在线视频| 日韩精品黄色网| 欧美另类高清videos| 国产在线视频91| 国产成人精品久久亚洲高清不卡| 在线观看久久久久久| 欧美中文字幕在线播放| 久久精品久久久久| 国产精品久久久久免费a∨大胸| 亚洲欧美综合v| 国内精品久久久久久| 日韩成人网免费视频| 亚洲free性xxxx护士白浆| 亚洲精品黄网在线观看| 91亚洲精品久久久久久久久久久久| 国产精品普通话| 91成人免费观看网站| 国产一区二区激情| 日韩欧美中文字幕在线播放| 国产第一区电影| 国产在线精品成人一区二区三区| 欧美性资源免费| 日韩中文字幕在线播放| 国产亚洲视频在线观看| 国产中文欧美精品| 日韩高清av在线| 国产精品久久久久久久久久三级| 欧美一级黑人aaaaaaa做受| 亚洲视频综合网| 欧美大片免费观看在线观看网站推荐| 久久久999成人| 国产成人在线精品| 欧美日韩国产精品专区| 国产日韩欧美黄色| 久久久久国产一区二区三区| 亚洲人成五月天| 欧美理论电影网| 亚洲午夜国产成人av电影男同| 久久香蕉国产线看观看av| 亚洲欧美成人网| 国产美女高潮久久白浆| 日韩av中文字幕在线免费观看| 91大神福利视频在线| 国产亚洲精品高潮| 狠狠色狠色综合曰曰| 欧美激情亚洲一区| 日韩综合中文字幕| 亚洲人成网站免费播放| 国产中文欧美精品| 国产精品久久久久久久久久尿| 国产一区二区美女视频| 免费av一区二区| 欧美日韩国产精品| 久久久噜噜噜久久| 国产精品吴梦梦| 日本久久91av| 精品国产精品自拍| 欧美日韩在线视频一区| 久久免费高清视频| 欧美精品在线观看| 在线国产精品播放| 欧美极品少妇xxxxⅹ免费视频| 亚洲天堂男人天堂| 亚洲视频欧美视频| 在线视频欧美日韩| 国产一区二区三区三区在线观看| 久久精品美女视频网站| 国产成人一区二区三区电影| 国产91色在线免费| 亚洲欧美日韩国产中文专区| 欧美激情中文字幕乱码免费| 欧美精品videosex牲欧美| 欧美巨大黑人极品精男| 欧美国产日韩视频| 日韩乱码在线视频| 亚洲人精品午夜在线观看| 国产精品高潮粉嫩av| 欧美又大又粗又长| 国产亚洲精品美女久久久久| 国产婷婷成人久久av免费高清| 午夜精品久久久久久久久久久久久| 亚洲电影免费观看高清完整版| 亚洲午夜精品视频| 韩国三级电影久久久久久| 亚洲成人激情在线观看| 伊人av综合网| 亚洲免费人成在线视频观看| 清纯唯美日韩制服另类| 国产精品高潮粉嫩av| 国产亚洲欧美视频| 日韩av在线一区二区| 亚洲va久久久噜噜噜| 亚洲精品91美女久久久久久久| 久久精品久久久久久| 国产精品福利在线| 欧美性生活大片免费观看网址| 福利视频一区二区| 深夜福利一区二区| 国产成人精品免高潮费视频| 国产亚洲视频在线观看| 国产精品第七十二页| 欧美亚洲另类在线| 日本精品久久中文字幕佐佐木| 欧美高清在线播放| 欧美日韩亚洲视频一区| 777午夜精品福利在线观看| 亚洲国产精品成人精品| 大荫蒂欧美视频另类xxxx| 欧美巨乳在线观看| 国产a∨精品一区二区三区不卡| 色噜噜国产精品视频一区二区| 亚洲最新av网址| 久久五月天综合| 亚洲第一区中文99精品| 日本高清不卡的在线| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品日韩电影| 最近2019中文字幕一页二页| 亚洲天堂久久av| 国产性猛交xxxx免费看久久| 久久久久日韩精品久久久男男| 成人乱人伦精品视频在线观看| 亚洲国产精品久久精品怡红院| 欧美视频国产精品| 国产精品人成电影在线观看| 91亚洲精品久久久久久久久久久久| 人人做人人澡人人爽欧美| 亚洲精品97久久| 日韩电影在线观看中文字幕| 欧美电影免费观看大全| 国产xxx69麻豆国语对白| 伊人久久男人天堂|