1. 程式人生 > 其它 >技術分享:Ettercap圖片嗅探

技術分享:Ettercap圖片嗅探

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的兩種方式:依賴查詢,依賴注入(更加適用)
原理:

  1. 通過Java反射技術獲取類的所有資訊
  2. 通過配置檔案(xml,@Configuration)或註解描述類之間的關係
  3. 通過這些配置資訊和反射技術構建物件間的依賴關係

Spring IOC容器實現物件和依賴的方式

  1. 根據Bean配置資訊在容器內建立Bean的定義登錄檔
  2. 根據登錄檔載入,例項化Bean,建立Bean與Bean的依賴關係
  3. 準備就緒的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的生命週期

    1. Spring容器從XML中讀取Bean的定義,並例項化
    2. Spring根據Bean的定義填充所有的屬性
    3. 如果Bean實現了BeanNameAware介面,Spring傳遞Bean的ID到setBeanName方法
    4. 如果Bean實現了BeanFactoryAware介面,Spring傳遞beanfactory給setBeanFactory方法
    5. 如果有任何與Bean相關聯的BeanPostProcessors,Spring會在postProcessorBeforeInitialication方法中呼叫他們
    6. 如果Bean實現了InitilizingBean了,呼叫它的afterPropertySet方法,如果bean聲明瞭初始化方法,呼叫此初始化方法
    7. 如果有BeanPostProcessors和Bean管理,這些Bean的postProcessorsAfterInitialization()方法將被呼叫
    8. 如果Bean實現了DisposableBean,它講呼叫destroy()方法