成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

簡(jiǎn)單了解Spring IoC相關(guān)概念原理

瀏覽:75日期:2023-08-26 16:55:30

Spring Ioc是Spring框架的基礎(chǔ),本文會(huì)簡(jiǎn)單的介紹下Spring Ioc。

Sprong Ioc即控制反轉(zhuǎn),它是一種通過(guò)描述(在java中可以是XML或注解)并通過(guò)第三方去產(chǎn)生或獲取特定對(duì)象的方式。

Spring IoC容器

1、Spring IoC容器的設(shè)計(jì)

Spring IoC容器的設(shè)計(jì)主要是基于BeanFactory和ApplicationContext這兩個(gè)接口,其中ApplicationContext是BeanFactory的一個(gè)子接口。也就是說(shuō),BeanFactory是Spring IoC容器定義的最底層接口,而ApplicationContext是其高級(jí)接口之一,因此大部分情況下會(huì)使用后者作為Spring IoC容器。

1.1 ClassPathXmlAppLicationContext

首先我們來(lái)認(rèn)識(shí)一下ApplicationContext的子類(lèi)ClassPathXmlAppLicationContext。先創(chuàng)建一個(gè).xml,代碼如下:

<?xml version='1.0' encoding='UTF-8'?><beans xmlns='http://www.springframework.org/schema/beans' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd'> <bean class='com.ssm.chapter.pojo.Source'> <property name='fruit' value='橙汁' /> <property name='sugar' value='少糖' /> <property name='size' value='大杯' /> </bean> <bean > <property name='beverageShop' value='貢茶' /> <property name='source' ref='source' /> </bean> </beans>

這里定義了兩個(gè)bean,這樣Spring IoC容器在初始化的時(shí)候就可以找到它們,然后使用ClassPathXmlAppLicationContext容器就可以將其初始化,代碼清單如下:

ApplicationContext ctx = new ClassPathXmlApplicationContext('spring-cfg.xml'); JuiceMaker juiceMaker = (JuiceMaker) ctx.getBean('juiceMaker'); System.out.println(juiceMaker.makeJuice());

這樣就會(huì)使用Application的實(shí)現(xiàn)類(lèi)ClassPathXmlAppLicationContext去初始化Spring IoC,然后開(kāi)發(fā)者就可以通過(guò)Ioc容器獲取資源了。

1.2 Spring Bean的生命周期

Spring IoC容器的本質(zhì)就是為了管理Bean。生命周期主要是為了了解Spring IoC容器初始化和銷(xiāo)毀Bean的過(guò)程,通過(guò)對(duì)它的學(xué)習(xí)就可以知道如何在初始和銷(xiāo)毀的時(shí)候加入自定義的方法,以滿(mǎn)足特定的需求。注:Spring IoC容器初始化和銷(xiāo)毀Bean的過(guò)程我這里就不介紹了啊,在網(wǎng)上很容易找到,這里主要是通過(guò)代碼去實(shí)現(xiàn)生命周期的過(guò)程。

除了了解生命周期的步驟之外,還要知道生命周期的接口是針對(duì)設(shè)么而言的,首先介紹生命周期的步驟:

①如果Bean實(shí)現(xiàn)了接口BeanNameAware,那么就會(huì)調(diào)用setBeanName方法。

②如果Bean實(shí)現(xiàn)了接口BeanFactoryAware,那么就會(huì)調(diào)用setBeanFactory方法。

③如果Bean實(shí)現(xiàn)了接口ApplicationContextAware,且Spring IoC容器也是ApplicationContext的一個(gè)實(shí)現(xiàn)類(lèi),那么就會(huì)調(diào)用setApplicationContext方法。

④如果Bean實(shí)現(xiàn)了接口BeanPostProcessor的,那么就會(huì)調(diào)用postProcessBeforeInitialization方法。

⑤如果Bean實(shí)現(xiàn)了接口BeanFactoryPostProcess,那么就會(huì)調(diào)用afterPropertiesSet方法。

⑥如果Bean自定義了初始化方法,它就會(huì)地用用已定義的初始化方法。

⑦如果Bean實(shí)現(xiàn)了接口BeanPostProcessor,那么就會(huì)調(diào)用postProcessAfterInitialization方法,之后這個(gè)bean就會(huì)完成了初始化,開(kāi)發(fā)者就可以從Spring IoC中獲取Bean的服務(wù)。

⑧如果Bean實(shí)現(xiàn)了接口DisposableBean,那么就會(huì)調(diào)用destroy的方法。

⑨如果定義了自定義銷(xiāo)毀方法,那么就會(huì)調(diào)用它。

此外,上面大部分的接口是針對(duì)單個(gè)Bean而言的;而B(niǎo)eanPostProcessor接口則是針對(duì)所有Bean而言的。為了測(cè)試BeanPostProcessor接口,可以寫(xiě)一個(gè)實(shí)現(xiàn)類(lèi):

package com.ssm.chapter.bean;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class BeanPostProcessorImpl implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println('[' + bean.getClass().getSimpleName() + ']對(duì)象' + beanName + '開(kāi)始初始化'); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println('[' + bean.getClass().getSimpleName() + ']對(duì)象' + beanName + '實(shí)例化完成'); return bean; }}

這樣BeanPostProcessor就被我們用代碼實(shí)現(xiàn)了,他會(huì)處理Spring IoC容器中的所有Bean。

為了更好的展示生命周期的內(nèi)容,將上面的代碼中JuiceMaker類(lèi)進(jìn)行修改:

package com.ssm.chapter.pojo;import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.BeanFactoryAware;import org.springframework.beans.factory.BeanNameAware;import org.springframework.beans.factory.DisposableBean;import org.springframework.beans.factory.InitializingBean;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;public class JuiceMaker implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean{ private String beverageShop = null; private Source source = null; public String getBeverageShop() { return beverageShop; } public void setBeverageShop(String beverageShop) { this.beverageShop = beverageShop; } public Source getSource() { return source; } public void setSource(Source source) { this.source = source; } public void init() { System.out.println('[' + this.getClass().getSimpleName() + ']執(zhí)行自定義初始化方法'); } public void myDestroy() { System.out.println('[' + this.getClass().getSimpleName() + ']執(zhí)行自定義銷(xiāo)毀方法'); } public String makeJuice() { String juice = '這是一杯由' + beverageShop + '飲品店,提供的' + source.getSize() +source.getSugar() +source.getFruit(); return juice; } @Override public void setBeanName(String name) { System.out.println('[' + this.getClass().getSimpleName() + ']調(diào)用BeanNameAware接口的setBeanName方法'); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println('[' + this.getClass().getSimpleName() + ']調(diào)用BeanFactoryAware接口的setBeanFactory方法'); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println('[' + this.getClass().getSimpleName() + ']調(diào)用ApplicationContextAware接口的setApplicationContext方法'); } @Override public void destroy() throws Exception { System.out.println('[' + this.getClass().getSimpleName() + ']調(diào)用DisposableBean接口的destroy方法'); } @Override public void afterPropertiesSet() throws Exception { System.out.println('[' + this.getClass().getSimpleName() + ']調(diào)用InitializingBean接口的afterPropertiesSet方法'); }}

這個(gè)類(lèi)實(shí)現(xiàn)了所以生命周期中的方法,以便以觀察生命周期,其中init方法是自定義的初始化方法,而myDestroy方法是自定義的銷(xiāo)毀方法,為了進(jìn)一步使用這兩個(gè)自定義方法,在描述Bean的時(shí)候,也要在.xml中進(jìn)行如下聲明:

<bean /> <bean class='com.ssm.chapter.pojo.Source'> <property name='fruit' value='橙汁' /> <property name='sugar' value='少糖' /> <property name='size' value='大杯' /> </bean> <bean init-method='init' destroy-method='myDestroy'> <property name='beverageShop' value='貢茶' /> <property name='source' ref='source' /> </bean>

這里定義了id為JuiceMaker的Bean,其屬性init-menth就是自定義的初始化方法,而destroy-method為自定義的銷(xiāo)毀方法。下面是測(cè)試代碼清單:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext('spring-cfg.xml'); JuiceMaker juiceMaker = (JuiceMaker) ctx.getBean('juiceMaker'); System.out.println(juiceMaker.makeJuice()); ctx.close();

日志如下:

[Source]對(duì)象source開(kāi)始初始化[Source]對(duì)象source實(shí)例化完成[JuiceMaker]調(diào)用BeanNameAware接口的setBeanName方法[JuiceMaker]調(diào)用BeanFactoryAware接口的setBeanFactory方法[JuiceMaker]調(diào)用ApplicationContextAware接口的setApplicationContext方法[JuiceMaker]對(duì)象juiceMaker開(kāi)始初始化[JuiceMaker]調(diào)用InitializingBean接口的afterPropertiesSet方法[JuiceMaker]執(zhí)行自定義初始化方法[JuiceMaker]對(duì)象juiceMaker實(shí)例化完成這是一杯由貢茶飲品店,提供的大杯少糖橙汁[JuiceMaker]調(diào)用DisposableBean接口的destroy方法[JuiceMaker]執(zhí)行自定義銷(xiāo)毀方法

從日志中可以看出,生命周期中的方法都被執(zhí)行了。也可以看到BeanPostProcessor針對(duì)的是全部Bean。我們也可以自定義初始化和銷(xiāo)毀Bean的方法。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
97se亚洲国产综合自在线| 欧美激情综合| 国产精品一区二区无线| 一本色道久久精品| 久久久99精品久久| 久久99久久久久| 亚洲视频大全| 国产精品乱人伦中文| 大胆欧美人体老妇| 欧美综合色免费| 亚洲国产成人91porn| 好看的日韩av电影| 精品日本一线二线三线不卡| 美女久久久精品| 亚洲精品在线免费| 国产精品乱码久久久久久| 风间由美一区二区三区在线观看| 欧美婷婷六月丁香综合色| 亚洲综合一区在线| 亚洲国产高清一区| 国产欧美日韩综合| 欧美一区二区三区免费看| 日韩欧美的一区| 国产传媒日韩欧美成人| 欧美探花视频资源| 日本欧美在线观看| 欧美一级一区| 亚洲国产综合色| 亚洲国产精选| 国产精品丝袜一区| 午夜日韩激情| 国产精品久久久久久久久果冻传媒 | 日韩欧美精品在线视频| 国产一区二区三区免费看 | 久久久久久电影| 99精品一区二区三区| 2欧美一区二区三区在线观看视频| 国产一区二区三区在线观看精品| 91久久精品一区二区| 水野朝阳av一区二区三区| 美女精品一区| 三级一区在线视频先锋 | 欧美高清不卡| 亚洲美女在线国产| 玖玖玖国产精品| 麻豆91在线观看| 91精品国产综合久久久久| 不卡一区二区三区四区| 中文字幕成人av| 亚洲综合首页| 激情亚洲综合在线| 精品国产91乱码一区二区三区| 欧美1区2区| 亚洲与欧洲av电影| 欧美日韩中字一区| 成人精品高清在线| 国产精品久久久久影院亚瑟| 国产视频一区欧美| 美国av一区二区| 久久人人超碰精品| 中文亚洲字幕| 日韩av一区二| 欧美日韩高清在线| 国产一区二区看久久| 久久综合999| 亚洲激情一区| 亚洲男同1069视频| 欧美在线一区二区| 国产在线麻豆精品观看| 91精品国产全国免费观看| 国产成人在线观看| 久久香蕉国产线看观看99| 欧美激情aⅴ一区二区三区| 国产精品久久久久久一区二区三区| 亚洲无线视频| 亚洲福利一二三区| 91国偷自产一区二区三区观看| 日韩av一区二区在线影视| 欧美艳星brazzers| 国产很黄免费观看久久| 精品久久免费看| 午夜精品国产| 亚洲人成人一区二区在线观看| 亚洲精品欧美精品| 亚洲mv在线观看| 欧美日韩视频在线一区二区| 久久国产精品72免费观看| 久久久99爱| 不卡视频一二三| 中文字幕在线免费不卡| 国产一区二区三区奇米久涩| 青青草视频一区| 51精品国自产在线| 91小视频免费看| 亚洲三级理论片| 在线免费观看一区| 国产高清不卡二三区| 久久精品免费| 成人一区在线观看| 久久久99精品久久| 亚洲国产婷婷香蕉久久久久久99| 亚洲国产另类精品专区| 欧洲av在线精品| 99国产精品久久久久久久久久 | 免费在线一区观看| 日韩欧美电影一二三| 欧美精品观看| 一区二区三区四区亚洲| 日韩欧美在线影院| 国产在线成人| 日本亚洲电影天堂| 2023国产精华国产精品| 亚洲成人原创| 蜜桃传媒麻豆第一区在线观看| 日韩欧美成人激情| 激情综合中文娱乐网| 午夜精品影院在线观看| 欧美日韩成人一区二区| 亚洲与欧洲av电影| 欧美日韩不卡视频| 国产在线欧美| 免费精品视频在线| 精品国产乱码久久久久久1区2区 | 91网站在线播放| 亚洲国产婷婷综合在线精品| 欧美日韩精品一区二区天天拍小说 | 色综合久久精品| 粉嫩一区二区三区性色av| 亚洲国产综合色| 日韩一二三区不卡| 一区二区不卡在线视频 午夜欧美不卡'| 久久99精品国产麻豆婷婷| 国产精品美女久久久久久2018| 色婷婷综合久色| 欧美日韩免费观看一区| 免费成人在线观看| 久久精品亚洲精品国产欧美kt∨ | 曰韩精品一区二区| 91精品国产综合久久精品| 欧美日韩三区四区| 琪琪久久久久日韩精品| 国产亚洲精品资源在线26u| 欧美精品日韩综合在线| 亚洲激情影院| 国产 欧美在线| 亚洲第一会所有码转帖| 精品成人一区二区三区四区| 免费试看一区| 欧美在线高清| 日本va欧美va精品| 国产精品久久久久影院亚瑟| 一本大道久久a久久精二百| 亚洲午夜一级| 国产毛片精品视频| 亚洲精品第1页| 精品国产乱码久久久久久夜甘婷婷 | 天天综合天天做天天综合| 久久久91精品国产一区二区精品| 在线观看网站黄不卡| 亚洲精品乱码| 国产69精品久久99不卡| 午夜久久久久久久久| 国产精品色哟哟| 欧美一区二区三区在线电影| 中文日韩在线| 91麻豆产精品久久久久久| 成人丝袜高跟foot| 水野朝阳av一区二区三区| 国产精品青草久久| 91精品欧美久久久久久动漫| 久久精品一区| 亚洲无线观看| 91一区二区三区在线播放| 国内精品自线一区二区三区视频| 亚洲人成精品久久久久久| 精品国产凹凸成av人导航| 色先锋久久av资源部| 日韩午夜在线| 欧美一区精品| 国产精品资源网站| 日韩一区欧美二区| 亚洲黄色av一区| 国产精品久久久久精k8| 欧美成人精品3d动漫h| 欧美日韩中文字幕精品| 国产乱人伦精品一区二区 | 日韩av网站免费在线| 国产精品乱码久久久久久| 日韩精品一区二| 欧美日韩一级视频| 久久精品中文| 国产欧美一区二区色老头| 欧美日韩亚洲一区| 国产在线播放一区二区三区| 亚洲成精国产精品女| 欧美激情自拍偷拍| 精品成人一区二区三区四区| 精品视频在线视频| 色国产综合视频| 一区二区三区国产盗摄|