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 緩存
配置舉例: