第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何使用 CDI 使單例實(shí)例隨處可見?

如何使用 CDI 使單例實(shí)例隨處可見?

暮色呼如 2023-03-23 15:40:48
我有一個(gè)應(yīng)用程序。每個(gè)用戶對應(yīng)實(shí)體“Client”。在會(huì)話期間,用戶使用他的實(shí)體。我有 JAX-RS + EJB 應(yīng)用程序。我希望這個(gè)實(shí)體在所有服務(wù)中都可見并作為一個(gè)單例使用。我想用 CDI 來實(shí)現(xiàn)它。首先,用戶登錄到應(yīng)用程序。登錄后,我想從base中獲取它的entity,并賦值給一個(gè)singleton,但是沒有成功。我嘗試了@Singleton注釋 ( javax.inject)@SessionScoped和@ApplicationScoped.我該怎么做?//Entity@Entity@SessionScope //or @Singlton/@ApplicationScopeclass Client { fields }//login service@Inject Client client;//After login I want to assign an entity from db[cleintEntity] //to entity which is available everywhere[client]client = clientEntity;我想做這個(gè)://some ejb@InjectClient client;//use entity我不想在整個(gè)應(yīng)用程序中傳輸指向?qū)嵗逆溄?,但我希望使?CDI 在任何地方都可以使用它。或者我是否需要?jiǎng)?chuàng)建一個(gè)單獨(dú)的ClientDAO,這將是我的單身人士?
查看完整描述

1 回答

?
千萬里不及你

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊

根據(jù)您的評論,您必須使用@SessionScope. 如果您希望所有用戶都擁有一個(gè)實(shí)例,則可以使用@Singletonand 。@ApplicationScope

解決您的問題:

  1. 你想Client在用戶登錄時(shí)實(shí)例化。所以當(dāng)你在登錄服務(wù)中時(shí),這個(gè)對象還沒有實(shí)例化,所以你不能把@Inject它放到你的登錄服務(wù)中,你應(yīng)該記得刪除注釋@Inject。

  2. 您需要使用@Produces注釋。當(dāng)你想控制你的類被實(shí)例化的方式時(shí),使用這個(gè)注解。當(dāng) CDI 容器要查找該類的實(shí)現(xiàn)時(shí)Client,如果它找到一個(gè)返回Client并具有@Produces注釋的方法,它會(huì)調(diào)用該方法,而不是僅僅實(shí)例化自身Client。你應(yīng)該做你的登錄業(yè)務(wù),然后創(chuàng)建一個(gè)實(shí)例Client并將其作為成員變量存儲(chǔ)在你的登錄服務(wù)中。然后在此類中添加一個(gè)返回該客戶端對象的方法,并用 注釋該方法@Produces。您的登錄服務(wù)的最終結(jié)構(gòu)如下所示:

   @SessionScope

    public class LoginService {

        private Client client;


        public void login(String username, String password) {

            //  implement login business


            //  if login is successful

            client = clientEntity;

        }


        @Produces

        @SessionScope

        public Client clientProducer() {

            return this.client;

        }

    }

您還可以將@Produces注釋放在字段之上。在這種情況下,CDI 容器將使用存儲(chǔ)在該字段上的值而不是調(diào)用方法。


    @SessionScope

    public class LoginService {

        @Produces

        @SessionScope

        private Client client;


        public void login(String username, String password) {

            //  implement login business


            //  if login is successful

            client = clientEntity;

        }

    }

當(dāng)然,這應(yīng)該被視為一種偽代碼。我不知道你們公司的所有細(xì)節(jié)。也許您實(shí)現(xiàn)邏輯的方式是完全錯(cuò)誤的;)。但要解決這個(gè)具體問題,@Produces應(yīng)該可行。


查看完整回答
反對 回復(fù) 2023-03-23
  • 1 回答
  • 0 關(guān)注
  • 146 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號