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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

@kafkalistener中id的作用_SSM框架(十一):Spring框架中的IoC(1)

發布時間:2024/9/27 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 @kafkalistener中id的作用_SSM框架(十一):Spring框架中的IoC(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

控制反轉 IOC:

控制反轉(Inversion of Control,縮寫為IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。

在bean.xml中加入bean標簽

<!--把對象的創建交給spring來管理--><bean id="accountService" class="cn.figo.service.impl.AccountServiceImpl"></bean><bean id="accountDao" class="cn.figo.dao.impl.AccountDaoImpl"></bean>

然后可以獲取spring的Ioc核心容器,并根據id獲取bean對象

// 獲取核心容器對象ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");// 根據id獲取bean對象IAccountService accountService = (IAccountService) ac.getBean("accountService");IAccountDao accountDao = (IAccountDao) ac.getBean("accountDao");

核心容器的繼承關系:

ApplicationContext 的父類和實現類

ApplicationContext的三個常用實現類:

ClassPathXmlApplicationContext:它可以加載類路徑下的配置文件,要求配置文件必須在類路徑下。不在的話,加載不了。(更常用)

FileSystemXmlApplicationContext:它可以加載磁盤任意路徑下的配置文件(必須有訪問權限)

AnnotationConfigApplicationContext:它是用于讀取注解創建容器的

核心容器的兩個接口

ApplicationContext: 單例對象適用,實際開發通常采用此接口

它在構建核心容器時,創建對象采取的策略是采用立即加載的方式。也就是說,只要一讀取完配置文件馬上就創建配置文件中配置的對象。

ApplicationContext 立即加載

BeanFactory: 多例對象使用

它在構建核心容器時,創建對象采取的策略是采用延遲加載的方式。也就是說,什么時候根據id獲取對象了,什么時候才真正的創建對象。

BeanFactory 延遲加載

spring對bean的管理

第一種方式:使用默認構造函數創建。

在spring的配置文件中使用bean標簽,配以id和class屬性之后,且沒有其他屬性和標簽時。

<bean id="accountService" class="cn.figo.service.impl.AccountServiceImpl"></bean>

采用的就是默認構造函數創建bean對象,此時如果類中沒有默認構造函數,則對象無法創建。

這里如果我們覆蓋掉默認構造函數后,運行會報錯

public AccountServiceImpl(String id){System.out.println("create service");}

第二種方式: 使用普通工廠中的方法創建對象(使用某個類中的方法創建對象,并存入spring容器)

通過某一個其他類中的一個方法來創建我們所需要的bean對象,比如這里有一個類InstanceFactory 中的方法 getAccountService()可以創建 IAccountService 對象

/*** 模擬一個工廠類(該類可能是存在于jar包中的,我們無法通過修改源碼的方式來提供默認構造函數)*/ public class InstanceFactory {public IAccountService getAccountService(){return new AccountServiceImpl();} }

在 xml中做如下配置

<bean id="instanceFactory" class="cn.figo.factory.InstanceFactory"></bean> <bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>

第三種方式:使用工廠中的靜態方法創建對象(使用某個類中的靜態方法創建對象,并存入spring容器)

通過某一個其他類中的靜態方法來創建我們所需要的bean對象,比如這里有一個類StaticFactory 中的方法 getAccountService()可以創建 IAccountService 對象

/*** 模擬一個工廠類(該類可能是存在于jar包中的,我們無法通過修改源碼的方式來提供默認構造函數)*/ public class StaticFactory {public static IAccountService getAccountService(){return new AccountServiceImpl();} }

在xml中做如下配置:

<bean id="accountService" class="cn.figo.factory.StaticFactory" factory-method="getAccountService"></bean>

這樣就可以成功創建相應的bean對象了

bean的作用范圍調整

bean標簽的scope屬性:

作用:用于指定bean的作用范圍

取值: 常用的就是單例的和多例的

singleton:單例的(默認值)

prototype:多例的

request:作用于web應用的請求范圍

session:作用于web應用的會話范圍

global-session:作用于集群環境的會話范圍(全局會話范圍),當不是集群環境時,它就是session

當設置bean標簽的scope為prototype時,是多例的

<bean id="accountService" class="cn.figo.service.impl.AccountServiceImpl" scope="prototype"></bean>

測試一下:

// 獲取核心容器對象ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");// 根據id獲取bean對象IAccountDao accountDao = (IAccountDao) ac.getBean("accountDao");System.out.println(accountDao);IAccountService accountService = (IAccountService) ac.getBean("accountService");IAccountService accountService2 = (IAccountService) ac.getBean("accountService");System.out.println(accountService);System.out.println(accountService2);System.out.println(accountService == accountService2);

當設置bean標簽的scope為singleton時,是單例的

bean對象的生命周期

單例對象:單例對象的生命周期和容器相同

出生:當容器創建時對象出生

活著:只要容器還在,對象一直活著

死亡:容器銷毀,對象消亡

多例對象

出生:當我們使用對象時spring框架為我們創建

活著:對象只要是在使用過程中就一直活著。

死亡:當對象長時間不用,且沒有別的對象引用時,由Java的垃圾回收器回收

在類中加入 init 和 destroy 方法

public class AccountServiceImpl implements IAccountService {private IAccountDao accountDao = new AccountDaoImpl();public AccountServiceImpl(){System.out.println("對象創建了");}public void saveAccount(){System.out.println("service中的saveAccount方法執行了。。。");}public void init(){System.out.println("對象初始化了。。。");}public void destroy(){System.out.println("對象銷毀了。。。");} }

在 xml中配置 初始化方法和銷毀方法

<bean id="accountService" class="cn.figo.service.impl.AccountServiceImpl"scope="singleton" init-method="init" destroy-method="destroy"></bean>

然后測試一下

ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); IAccountService accountService = (IAccountService) ac.getBean("accountService"); accountService.saveAccount(); System.out.println(accountService); ac.close();

單例時:

單例時 對象隨容器一起銷毀

多例時:

多例時 即使容器關閉,對象也沒有被銷毀

總結

以上是生活随笔為你收集整理的@kafkalistener中id的作用_SSM框架(十一):Spring框架中的IoC(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

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