Spring基礎

Spring中Bean生命周期過程:

1.Spring對Bean進行實例化(相當于程序中的new Xx())

2.Spring將值和Bean的引用注入進Bean對應的屬性中

3.如果Bean實現了BeanNameAware接口,Spring將Bean的ID傳遞給setBeanName()方法(實現BeanNameAware清主要是為了通過Bean的引用來獲得Bean的ID,一般業(yè)務中是很少有用到Bean的ID的)

4.如果Bean實現了BeanFactoryAware接口,Spring將調用setBeanDactory(BeanFactory bf)方法并把BeanFactory容器實例作為參數傳入。(實現BeanFactoryAware 主要目的是為了獲取Spring容器,如Bean通過Spring容器發(fā)布事件等)

5.如果Bean實現了ApplicationContextAwaer接口,Spring容器將調用setApplicationContext(ApplicationContext ctx)方法,把y應用上下文作為參數傳入.(作用與BeanFactory類似都是為了獲取Spring容器,不同的是Spring容器在調用setApplicationContext方法時會把它自己作為setApplicationContext 的參數傳入,而Spring容器在調用setBeanDactory前需要程序員自己指定(注入)setBeanDactory里的參數BeanFactory )

6.如果Bean實現了BeanPostProcess接口,Spring將調用它們的postProcessBeforeInitialization(預初始化)方法(作用是在Bean實例創(chuàng)建成功后對進行增強處理,如對Bean進行修改,增加某個功能)

7.如果Bean實現了InitializingBean接口,Spring將調用它們的afterPropertiesSet方法,作用與在配置文件中對Bean使用init-method聲明初始化的作用一樣,都是在Bean的全部屬性設置成功后執(zhí)行的初始化方法。

8.如果Bean實現了BeanPostProcess接口,Spring將調用它們的postProcessAfterInitialization(后初始化)方法(作用與6的一樣,只不過6是在Bean初始化前執(zhí)行的,而這個是在Bean初始化后執(zhí)行的,時機不同 )

9.經過以上的工作后,Bean將一直駐留在應用上下文中給應用使用,直到應用上下文被銷毀

10.如果Bean實現了DispostbleBean接口,Spring將調用它的destory方法,作用與在配置文件中對Bean使用destory-method屬性的作用一樣,都是在Bean實例銷毀前執(zhí)行的方法。參考:Spring實戰(zhàn)


說說Servlet 生命周期、工作原理

https://blog.csdn.net/danielzhou888/article/details/70835418

Servlet 加載—>實例化—>服務—>銷毀。

init():

在Servlet的生命周期中,僅執(zhí)行一次init()方法。它是在服務器裝入Servlet時執(zhí)行的,負責初始化Servlet對象??梢耘渲梅掌?,以在啟動服務器或客戶機首次訪問Servlet時裝入Servlet。無論有多少客戶機訪問Servlet,都不會重復執(zhí)行init()。

service():

它是Servlet的核心,負責響應客戶的請求。每當一個客戶請求一個HttpServlet對象,該對象的Service()方法就要調用,而且傳遞給這個方法一個“請求”(ServletRequest)對象和一個“響應”(ServletResponse)對象作為參數。在HttpServlet中已存在Service()方法。默認的服務功能是調用與HTTP請求的方法相應的do功能。

destroy():

僅執(zhí)行一次,在服務器端停止且卸載Servlet時執(zhí)行該方法。當Servlet對象退出生命周期時,負責釋放占用的資源。一個Servlet在運行service()方法時可能會產生其他的線程,因此需要確認在調用destroy()方法時,這些線程已經終止或完成。

Spring bean的加載方式:

https://blog.csdn.net/icarus_wang/article/details/51649635


主要包括:

- 基于XML的配置方式

- 基于注解的配置方式

- 基于Java類的配置方式

一.基于XML的配置

請看Spring學習(十二)Spring 的配置文件概述

二.基于注解的配置

不過使用resource-pattern并不能提供給我們完善的功能,所有我們得使用過濾子元素的方法。

? ? ? ? ?

其中:

include-filter表示要包含的目標類,

exclude-filter表示要排除在外的目標類

1.Bean的定義注解

Spring自2.0開始,陸續(xù)引入了一些注解用于簡化Spring的開發(fā)。

@Repository注解便屬于最先引入的一批,用于將數據訪問層(DAO層)的類標識為Spring Bean。具體使用如下:

①首先使用@Repository將DAO類聲明為Bean

②在XML配置文件中啟動Spring的自動掃描功能

......

如此的話,我們便不在需要在XML當中顯式使用bean來進行bean的配置。Spring容器在初始化的時候便會自動掃描base-package所指定的包以及子包下面的所有class文件。所有標注為Repository的類將被自動注冊為bean。

Spring2.5在@Repository的基礎上增加了功能類似的額外三個注解,總共有如下四種注解:

@Component:一個泛化的概念,表示一個組件(Bean),可作用在任何層次

@Controller:用于對Controller實現類進行標注,目前該功能與Component相同

@Repository:用于對DAO實現類進行標注

@Service:用于對Service實現類進行標注,目前該功能與Component相同

4.Bean的自動裝配注解

@Autowired可以對成員變量、方法和構造函數進行標注,來完成自動裝配的工作,他根據類型進行自動裝配,如果需要按名稱進行裝配,則需要配合@Qualifier使用。

當標注了@Autowired的方法所需的類型在Spring容器中不存在的話會拋出異常

三.基于Java類的配置

基于Java類定義Bean配置元數據,其實就是通過Java類定義Spring配置元數據,且直接消除XML配置文件。

首先讓我們看一下基于Java類如何定義Bean配置元數據,具體步驟如下:

使用@Configuration注解需要作為配置的類,表示該類將定義Bean的元數據

使用@Bean注解相應的方法,該方法名默認就是Bean的名稱,該方法返回值就是Bean的對象。

AnnotationConfigApplicationContext或子類進行加載基于java類的配置


AOP的實現

AOP的基本概念:

Advice:通知,定義在指定連接點上做什么內容。是AOP聯盟定義的一個接口,SpringAOP在實現中提供了更多的具體通知類型,如BeforeAdvice、AfterAdvice、ThrowsAdvice等。

Pointcut:切點,符合切點表達式的連接點,也就是被真正切入的地方。

Aspect:切面,切入系統的一個切面,比如事物管理是一個切面,權限管理是一個切面。

Join point:連接點,進行橫向切入的位置。

AOP的理解:

Spring AOP是基于JDK動態(tài)代理和CGLIB(動態(tài)字節(jié)碼增強技術)實現的,在方法執(zhí)行的前后進行攔截。

對于AOP的理解,可以引用網友的一段話:

aop切面編程就是在常規(guī)的執(zhí)行java類中方法前或執(zhí)行后加入自定義的方法。比如你 本來每天都去打醬油,去,打醬油,回。現在我每天在你打醬油路上等著,你去打醬油的時候我打你一頓,回來的時候給你點糖果吃。你根本不知道為什么我會在路上攔住打你。所以在切面中插入你自定義的方法,這個方法的執(zhí)行和本身要執(zhí)行的類方法無關系,也就是不是這個類的方法來調用你寫的方法的,你寫的方法什么時候執(zhí)行都是要通過在配置指定。我打完你,你該打醬油還是去打醬油,當然我如果是攔住你讓你醬油打少點,你打醬油的時候還是會打那么多,但是在你打完醬油回來的時候我可以把你的醬油倒些出去,所以嵌入的自定義方法對要調用的類方法本身沒有影響,但是可以操縱這個方法的返結果或者處理結果。?

AOP的設計分析:

AOP的配置方式:

一般可以有以下幾種方式,其中aop:config用的最多,AspectJ的注解用的也還好,ProxyFactoryBean就相對麻煩點,不過是最基本的,最好理解AOP原理的,根據項目不同進行選擇。

配置ProxyFactoryBean,顯式地設置advisors, advice, target等

通過aop:config來配置

通過aop:aspectj-autoproxy來配置,使用AspectJ的注解來標識通知及切入點

AOP的應用場景:

應用場景體現在兩個方面:一是應用可以直接使用AOP的功能,設計應用的橫切關注點,把擴約應用程序多個模塊的功能抽象出來,并通過簡單的AOP的使用,靈活的編制到模塊中,比如:日志記錄的功能。另一方面,在Spring內部,一些支持模塊也是利用Spring AOP來實現的,如:事務處理,Caching 緩存

配置舉例:

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 本來是準備看一看Spring源碼的。然后在知乎上看到來一個帖子,說有一群**自己連Spring官方文檔都沒有完全讀...
    此魚不得水閱讀 7,049評論 4 21
  • 1.1 spring IoC容器和beans的簡介 Spring 框架的最核心基礎的功能是IoC(控制反轉)容器,...
    simoscode閱讀 6,861評論 2 22
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,968評論 1 92
  • 我喜歡在這迷宮般的胡同里轉悠,這些胡同離天安門不遠,走路也就一兩公里吧。與那里的規(guī)整雄偉不同,這里雖然有些亂,但深...
    俗然閱讀 832評論 2 20

友情鏈接更多精彩內容