技術分享:Ettercap圖片嗅探
阿新 • • 發佈:2022-05-05
1. Spring的幾個概念
- 非侵入式框架
- 侵入式:對於EJB,Structs這樣的框架,要實現特定的介面,繼承特定的類才能增強功能,改變了類的結構
- 非侵入式,對於Hibernate,Spring等,通過AOP等技術,對現有類無影響,增強JavaBean功能
- 鬆耦合框架
面向介面程式設計,通過實現對應的介面來實現,例如DAO層和Service層通過DaoFactory實現鬆耦合 - AOP
面向切面程式設計,在執行某些程式碼前,執行另外的程式碼 - DI(同IOC)
依賴注入,將物件的建立的權力及物件的生命週期的管理過程交由Spring框架來處理 - IOC(降耦合,資源集中管理)
控制反轉,物件的建立交給外部容器(IOC容器)完成,使得實現物件不用再程式中寫死,建立物件時,只需要為IOC容器提供配置物件的資訊就行 - 模組
- Spring Core核心功能,提供IOC容器,解決物件建立以及依賴關係
- Spring Web 對Web的支援
- Spring DAO 對JDBC的支援
- Spring ORM 對ORM框架的支援(HIbernate,mybatis,SpringData等)
- Spring AOP 面向切面程式設計,增強JavaBean的功能
- SpringEE 對其它javaEE模組的支援
2. 依賴注入
因為物件的屬性上有其它物件的變數,因此物件之間的依賴關係,實際就是給物件的屬性賦值。
Spring給屬性賦值的方式:
- 建構函式
- set方法注入
- p名稱空間
對set方法的一種優化
applicationContext.xml配置檔案<bean id="userDao" class="UserDao"/> <bean id="userService" class="UserService" p:userDao-ref="userDao"/>
- 自動裝配
- 根據名字裝配
<bean id="userDao" class="UserDao"/> <!--1.通過名字來自動裝配 2.發現userService中有個叫userDao的屬性 3.看看IOC容器中沒有叫userDao的物件 4.如果有,就裝配進去--> <bean id="userService" class="UserService" autowire="byName"/>
- 根據型別裝配
<bean id="userDao" class="UserDao"/> <!--1.通過名字來自動裝配 2.發現userService中有個叫userDao的屬性 3.看看IOC容器UserDao型別的物件 4.如果有,就裝配進去--> <bean id="userService" class="UserService" autowire="byType"/>
- 註解
@Autowired
使用註解完成自動裝配- 在構造器上修飾
- 在setter上修飾
- 使用@Inject,同Autowired
3. IOC
控制反轉,實現IOC的兩種方式:依賴查詢,依賴注入(更加適用)
原理:
- 通過Java反射技術獲取類的所有資訊
- 通過配置檔案(xml,@Configuration)或註解描述類之間的關係
- 通過這些配置資訊和反射技術構建物件間的依賴關係
Spring IOC容器實現物件和依賴的方式
- 根據Bean配置資訊在容器內建立Bean的定義登錄檔
- 根據登錄檔載入,例項化Bean,建立Bean與Bean的依賴關係
- 準備就緒的Bean放入Map緩衝池中,等待程式呼叫
Spring容器:
- BeanFactory
基礎的Bean工廠,面向Spring的 - ApplicationContext
在BeanFactory基礎上,面向Spring框架的開發者,大多數場合都會使用ApplicationContext
區別:
- ApplicationContext利用反射識別配置檔案中定義的BeanPostProcessor,InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor後置器,並自動註冊到應用上下文中,而BeanFactory需要手工盜用addBeanPostProcessor()方法進行註冊
- ApplicationContext初始化應用上下文就可以例項化所有的單例Bean,BeanFactory初始化並不會例項化Bean,直到第一次訪問某個bean才例項化
Bean初始化過程:
- BeanDefinitionReader讀取Resource指向的配置檔案資源,然後解析配置檔案。配置檔案中的每個
<bean>
都會解析為一個BeadDefinition物件,並儲存在BeanDefinitionRegistry中 - 容器掃描BeanDefinitionRegistry中的BeanDefinition;呼叫InstantiationStrategy進行Bean例項化的工作,使用BeanWrapper完成Bean屬性的設定工作
- 單例Bean的緩衝池,是通過HashMap實現的緩衝池,key為BeanName
IOC容器裝配Bean
-
裝配Bean方式
- XML配置(常見)
- 註解(常見)
- JavaConfig
- 基於GroovyDSL配置
-
依賴注入方式
- 屬性注入 setter()方法
- 建構函式注入
- 工廠方法注入
-
物件間的關係
- 依賴 (depend-on 前置依賴,依賴的bean初始化後,當前的bean才初始化)
- 繼承 (abstract,parent實現繼承關係)
- 引用 (ref關係)
-
Bean作用域
- 單例Singleton
- 多例prototype
- web相關的Bean作用域
- request
- session
-
自動裝配的歧義性
同一個介面不同的實現類- 使用@Primary註解設定為首選的注入Bean
- 使用@Qualifier註解設定特定名稱的Bean來限定注入
-
Spring框架中Bean的生命週期
- Spring容器從XML中讀取Bean的定義,並例項化
- Spring根據Bean的定義填充所有的屬性
- 如果Bean實現了BeanNameAware介面,Spring傳遞Bean的ID到setBeanName方法
- 如果Bean實現了BeanFactoryAware介面,Spring傳遞beanfactory給setBeanFactory方法
- 如果有任何與Bean相關聯的BeanPostProcessors,Spring會在postProcessorBeforeInitialication方法中呼叫他們
- 如果Bean實現了InitilizingBean了,呼叫它的afterPropertySet方法,如果bean聲明瞭初始化方法,呼叫此初始化方法
- 如果有BeanPostProcessors和Bean管理,這些Bean的postProcessorsAfterInitialization()方法將被呼叫
- 如果Bean實現了DisposableBean,它講呼叫destroy()方法