1. 程式人生 > 其它 >Python爬取微博熱搜榜,將資料存入資料庫

Python爬取微博熱搜榜,將資料存入資料庫

Spring

簡介

優點:

  • 開源的免費框架

  • 輕量級非侵入式的框架

  • IOC和AOP

  • 支援事務的處理,對框架整合的支援

Spring就是一個輕量級的控制反轉IOC和麵向切面程式設計AOP的框架

控制反轉IOC是一種設計思想,DI是實現IOC的一種方法

Spring Bean

Spring Bean的生命週期

Bean 生命週期的整個執行過程描述如下。

1)根據配置情況呼叫 Bean 構造方法或工廠方法例項化 Bean。

2)利用依賴注入完成 Bean 中所有屬性值的配置注入。

3)如果 Bean 實現了 BeanNameAware 介面,則 Spring 呼叫 Bean 的 setBeanName() 方法傳入當前 Bean 的 id 值。

4)如果 Bean 實現了 BeanFactoryAware 介面,則 Spring 呼叫 setBeanFactory() 方法傳入當前工廠例項的引用。

5)如果 Bean 實現了 ApplicationContextAware 介面,則 Spring 呼叫 setApplicationContext() 方法傳入當前 ApplicationContext 例項的引用。

6)如果 BeanPostProcessor 和 Bean 關聯,則 Spring 將呼叫該介面的預初始化方法 postProcessBeforeInitialzation() 對 Bean 進行加工操作,此處非常重要,Spring 的 AOP 就是利用它實現的。

7)如果 Bean 實現了 InitializingBean 介面,則 Spring 將呼叫 afterPropertiesSet() 方法。

8)如果在配置檔案中通過 init-method 屬性指定了初始化方法,則呼叫該初始化方法。

9)如果 BeanPostProcessor 和 Bean 關聯,則 Spring 將呼叫該介面的初始化方法 postProcessAfterInitialization()。此時,Bean 已經可以被應用系統使用了。

10)如果在 <bean> 中指定了該 Bean 的作用範圍為 scope="singleton",則將該 Bean 放入 Spring IoC 的快取池中,將觸發 Spring 對該 Bean 的生命週期管理;如果在 <bean> 中指定了該 Bean 的作用範圍為 scope="prototype",則將該 Bean 交給呼叫者,呼叫者管理該 Bean 的生命週期,Spring 不再管理該 Bean。

11)如果 Bean 實現了 DisposableBean 介面,則 Spring 會呼叫 destory() 方法將 Spring 中的 Bean 銷燬;如果在配置檔案中通過 destory-method 屬性指定了 Bean 的銷燬方法,則 Spring 將呼叫該方法對 Bean 進行銷燬。

依賴注入

依賴注入(Dependency Injection,DI)和控制反轉含義相同,它們是從兩個角度描述的同一個概念。

當某個 Java 例項需要另一個 Java 例項時,傳統的方法是由呼叫者建立被呼叫者的例項(例如,使用 new 關鍵字獲得被呼叫者例項),而使用 Spring框架後,被呼叫者的例項不再由呼叫者建立,而是由 Spring 容器建立,這稱為控制反轉。

Spring 容器在建立被呼叫者的例項時,會自動將呼叫者需要的物件例項注入給呼叫者,這樣,呼叫者通過 Spring 容器獲得被呼叫者例項,這稱為依賴注入。

依賴注入主要有兩種實現方式,分別是屬性 setter 注入和構造方法注入。具體介紹如下。

1)屬性 setter 注入

指 IoC 容器使用 setter 方法注入被依賴的例項。通過呼叫無參構造器或無參 static 工廠方法例項化 bean 後,呼叫該 bean 的 setter 方法,即可實現基於 setter 的 DI。

2)構造方法注入

指 IoC 容器使用構造方法注入被依賴的例項。基於構造器的 DI 通過呼叫帶引數的構造方法實現,每個引數代表一個依賴。

作用域的種類

Spring 容器在初始化一個 Bean 的例項時,同時會指定該例項的作用域。Spring3 為 Bean 定義了五種作用域,具體如下。

1)singleton

單例模式,使用 singleton 定義的 Bean 在 Spring 容器中只有一個例項,這也是 Bean 預設的作用域。

2)prototype

原型模式,每次通過 Spring 容器獲取 prototype 定義的 Bean 時,容器都將建立一個新的 Bean 例項。

3)request

在一次 HTTP 請求中,容器會返回該 Bean 的同一個例項。而對不同的 HTTP 請求,會返回不同的例項,該作用域僅在當前 HTTP Request 內有效。

4)session

在一次 HTTP Session 中,容器會返回該 Bean 的同一個例項。而對不同的 HTTP 請求,會返回不同的例項,該作用域僅在當前 HTTP Session 內有效。

5)global Session

在一個全域性的 HTTP Session 中,容器會返回該 Bean 的同一個例項。該作用域僅在使用 portlet context 時有效。

Spring基於Annotation裝配Bean

1)@Component

可以使用此註解描述 Spring 中的 Bean,但它是一個泛化的概念,僅僅表示一個元件(Bean),並且可以作用在任何層次。使用時只需將該註解標註在相應類上即可。

2)@Repository

用於將資料訪問層(DAO層)的類標識為 Spring 中的 Bean,其功能與 @Component 相同。

3)@Service

通常作用在業務層(Service 層),用於將業務層的類標識為 Spring 中的 Bean,其功能與 @Component 相同。

4)@Controller

通常作用在控制層(如Struts2的 Action),用於將控制層的類標識為 Spring 中的 Bean,其功能與 @Component 相同。

5)@Autowired

用於對 Bean 的屬性變數、屬性的 Set 方法及建構函式進行標註,配合對應的註解處理器完成 Bean 的自動配置工作。預設按照 Bean 的型別進行裝配。

6)@Resource

其作用與 Autowired 一樣。其區別在於 @Autowired 預設按照 Bean 型別裝配,而 @Resource 預設按照 Bean 例項名稱進行裝配。

@Resource 中有兩個重要屬性:name 和 type。

Spring 將 name 屬性解析為 Bean 例項名稱,type 屬性解析為 Bean 例項型別。如果指定 name 屬性,則按例項名稱進行裝配;如果指定 type 屬性,則按 Bean 型別進行裝配。

如果都不指定,則先按 Bean 例項名稱裝配,如果不能匹配,則再按照 Bean 型別進行裝配;如果都無法匹配,則丟擲 NoSuchBeanDefinitionException 異常。

7)@Qualifier

與 @Autowired 註解配合使用,會將預設的按 Bean 型別裝配修改為按 Bean 的例項名稱裝配,Bean 的例項名稱由 @Qualifier 註解的引數指定。

Bean的自動裝配

名稱說明
byName 根據 Property 的 name 自動裝配,如果一個 Bean 的 name 和另一個 Bean 中的 Property 的 name 相同,則自動裝配這個 Bean 到 Property 中。
byType 根據 Property 的資料型別(Type)自動裝配,如果一個 Bean 的資料型別相容另一個 Bean 中 Property 的資料型別,則自動裝配。
constructor 根據構造方法的引數的資料型別,進行 byType 模式的自動裝配。
autodetect 如果發現預設的構造方法,則用 constructor 模式,否則用 byType 模式。
no 預設情況下,不使用自動裝配,Bean 依賴必須通過 ref 元素定義。

Spring AOP

為什麼需要AOP

AOP(Aspect Orient Programming)也就是面向切面程式設計,作為面向物件程式設計的一種補充,已經成為一種比較成熟的程式設計方式。其實AOP問世的時間並不太長,AOP和OOP互為補充,面向切面程式設計將程式執行過程分解成各個切面。

AOP專門用於處理系統中分佈於各個模組(不同方法)中的交叉關注點的問題,在JavaEE應用中,常常通過AOP來處理一些具有橫切性質的系統級服務,如事務管理、安全檢查、快取、物件池管理等,AOP已經成為一種非常常用的解決方案。

面向切面知識

名稱說明
Joinpoint(連線點) 指那些被攔截到的點,在 Spring 中,可以被動態代理攔截目標類的方法。
Pointcut(切入點) 指要對哪些 Joinpoint 進行攔截,即被攔截的連線點。
Advice(通知) 指攔截到 Joinpoint 之後要做的事情,即對切入點增強的內容。
Target(目標) 指代理的目標物件。
Weaving(植入) 指把增強程式碼應用到目標上,生成代理物件的過程。
Proxy(代理) 指生成的代理物件。
Aspect(切面) 切入點和通知的結合。

Spring的AOP支援

Spring中的AOP代理由Spring的IoC容器負責生成、管理,其依賴關係也由IoC容器負責管理。 為了在應用中使用@AspectJ支援,Spring需要新增三個庫:

  • aspectjweaver.jar

  • aspectjrt.jar

  • aopalliance.jar

並在Spring配置檔案中做如下配置:

<!--啟動@AspectJ支援-->
<aop:aspectj-autoproxy/>

<!--指定自動搜尋Bean元件、自動搜尋切面類-->
<context:component-scan base-package="edu.shu.sprint.service">
<context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/>
</context:component-scan>

ProxyFactoryBean

  <!--生成代理物件 -->
<bean id="customerDaoProxy"
class="org.springframework.aop.framework.ProxyFactoryBean">
<!--代理實現的介面 -->
<property name="proxyInterfaces" value="com.mengma.dao.CustomerDao" />
<!--代理的目標物件 -->
<property name="target" ref="customerDao" />
<!--用通知增強目標 -->
<property name="interceptorNames" value="myAspect" />
<!-- 如何生成代理,true:使用cglib; false :使用jdk動態代理 -->
<property name="proxyTargetClass" value="true" />
</bean>

AspectJ

使用 AspectJ 開發 AOP 通常有兩種方式:

  • 基於 XML 的宣告式。

  • 基於 Annotation 的宣告式。

<!--AOP 程式設計 -->
<aop:config>
<aop:aspect ref="myAspect">
<!-- 配置切入點,通知最後增強哪些方法 -->
<aop:pointcut expression="execution ( * com.mengma.dao.*.* (..))"
id="myPointCut" />
<!--前置通知,關聯通知 Advice和切入點PointCut -->
<aop:before method="myBefore" pointeut-ref="myPointCut" />
<!--後置通知,在方法返回之後執行,就可以獲得返回值returning 屬性 -->
<aop:after-returning method="myAfterReturning"
pointcut-ref="myPointCut" returning="returnVal" />
<!--環繞通知 -->
<aop:around method="myAround" pointcut-ref="myPointCut" />
<!--丟擲通知:用於處理程式發生異常,可以接收當前方法產生的異常 -->
<!-- *注意:如果程式沒有異常,則不會執行增強 -->
<!-- * throwing屬性:用於設定通知第二個引數的名稱,型別Throwable -->
<aop:after-throwing method="myAfterThrowing"
pointcut-ref="myPointCut" throwing="e" />
<!--最終通知:無論程式發生任何事情,都將執行 -->
<aop:after method="myAfter" pointcut-ref="myPointCut" />
</aop:aspect>
</aop:config>

Spring 事務

在 Spring 中,除了使用基於 XML 的方式可以實現宣告式事務管理以外,還可以通過 Annotation 註解的方式實現宣告式事務管理。

使用 Annotation 的方式非常簡單,只需要在專案中做兩件事,具體如下。

1)在 Spring 容器中註冊驅動,程式碼如下所示:

<tx:annotation-driven transaction-manager="txManager"/>

2)在需要使用事務的業務類或者方法中添加註解 @Transactional,並配置 @Transactional 的引數。

整合Mybatis

<!-- mybatis -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.cff.springwork.mybatis.mapper" />
</bean>

問題

  1. Bean的生命週期有哪些?

    1.1 解析類得到BeanDefiniton

    1.2 如果有多個構造方法,要推斷構造方法

    1.3 例項化得到一個物件

    1.4 堆物件中加了@Autowired註解的屬性進行屬性填充

    1.5 回撥Aware方法

    1.6 呼叫BeanPostProcessor的初始化前的方法

    1.7 呼叫初始化方法

    1.8 呼叫BeanPostProcessor的初始化後的方法,在這裡會進行AOP

    1.9 如果當前建立的Bean是單例則會把Bean放入單例池

    1.10 使用bean

    1.11 Spring容器關閉時呼叫DisposableBean中的destory()方法

  2. 什麼是BeanDefinition?

  3. Bean的後置處理器與Bean工廠的後置處理器?

  4. BeanFactory和ApplicationContext有什麼區別?

    ApplicationContext是BeanFactory的子介面

  5. 談談你對Spring的認識

  6. 談談你對Spring中IOC和AOP的理解

  7. Spring MVC設計原理

  8. 迴圈依賴和二級快取的處理