javascript
@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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pcdmis怎么导出模型_从代数几何到导
- 下一篇: python 字符串处理 字典_pyth