1. 程式人生 > 資料庫 >sqlserver怎樣查詢出當天,本週,本月的資料???

sqlserver怎樣查詢出當天,本週,本月的資料???

1、Spring是什麼? 或是什麼是 Spring 框架?
Spring是一個輕量級的IoC和AOP容器框架。是為Java應用程式提供基礎性服務的一套框架,目的是用於簡化企業應用程式的開發,它使得開發者只需要關心業務需求。主要包括以下七個模組:

Spring Context:提供框架式的Bean訪問方式,以及企業級功能(JNDI、定時任務等);
Spring Core:核心類庫,所有功能都依賴於該類庫,提供IOC和DI服務;
Spring AOP:AOP服務;
Spring Web:提供了基本的面向Web的綜合特性,提供對常見框架如Struts2的支援,Spring能夠管理這些框架,將Spring的資源注入給框架,也能在這些框架的前後插入攔截器;

Spring MVC:提供面向Web應用的Model-View-Controller,即MVC實現。
Spring DAO:對JDBC的抽象封裝,簡化了資料訪問異常的處理,並能統一管理JDBC事務;
Spring ORM:對現有的ORM框架的支援;
2、Spring 的優點?

(1)spring屬於低侵入式設計,程式碼的汙染極低;

(2)spring的DI機制將物件之間的依賴關係交由框架處理,減低元件的耦合性;

(3)Spring提供了AOP技術,支援將一些通用任務,如安全、事務、日誌、許可權等進行集中式管理,從而提供更好的複用。

(4)spring對於主流的應用框架提供了整合支援。
3,Spring有幾種配置方式


(1),基於XML的配置
(2),基於註解配置
(3),基於java配置
4、Spring的IoC理解:

(1)IOC就是控制反轉,指建立物件的控制權轉移給Spring框架進行管理,並由Spring根據配置檔案去建立例項和管理各個例項之間的依賴關係,物件與物件之間鬆散耦合,也利於功能的複用。DI依賴注入,和控制反轉是同一個概念的不同角度的描述,即 應用程式在執行時依賴IoC容器來動態注入物件需要的外部依賴。

(2)最直觀的表達就是,以前建立物件的主動權和時機都是由自己把控的,IOC讓物件的建立不用去new了,可以由spring自動生產,使用java的反射機制,根據配置檔案在執行時動態的去建立物件以及管理物件,並呼叫物件的方法的。

(3)Spring的IOC有三種注入方式 :構造器注入、setter方法注入、根據註解注入。

5、Spring的AOP理解:
AOP,一般稱為面向切面,作為面向物件的一種補充,用於將那些與業務無關,但卻對多個物件產生影響的公共行為和邏輯,抽取並封裝為一個可重用的模組,這個模組被命名為“切面”(Aspect),減少系統中的重複程式碼,降低了模組間的耦合度,提高系統的可維護性。可用於許可權認證、日誌、事務處理。

AOP實現的關鍵在於 代理模式,AOP代理主要分為靜態代理和動態代理。靜態代理的代表為AspectJ;動態代理則以Spring AOP為代表。

(1)AspectJ是靜態代理,也稱為編譯時增強,AOP框架會在編譯階段生成AOP代理類,並將AspectJ(切面)織入到Java位元組碼中,執行的時候就是增強之後的AOP物件。

(2)Spring AOP使用的動態代理,所謂的動態代理就是說AOP框架不會去修改位元組碼,而是每次執行時在記憶體中臨時為方法生成一個AOP物件,這個AOP物件包含了目標物件的全部方法,並且在特定的切點做了增強處理,並回調原物件的方法。

Spring AOP中的動態代理主要有兩種方式,JDK動態代理和CGLIB動態代理:

    ① JDK動態代理只提供介面的代理,不支援類的代理,要求被代理類實現介面。JDK動態代理的核心是InvocationHandler介面和Proxy類,在獲取代理物件時,使用Proxy類來動態建立目標類的代理類(即最終真正的代理類,這個類繼承自Proxy並實現了我們定義的介面),當代理物件呼叫真實物件的方法時, InvocationHandler 通過invoke()方法反射來呼叫目標類中的程式碼,動態地將橫切邏輯和業務編織在一起;

InvocationHandler 的 invoke(Object proxy,Method method,Object[] args):proxy是最終生成的代理物件; method 是被代理目標例項的某個具體方法; args 是被代理目標例項某個方法的具體入參, 在方法反射呼叫時使用。

    ② 如果被代理類沒有實現介面,那麼Spring AOP會選擇使用CGLIB來動態代理目標類。CGLIB(Code Generation Library),是一個程式碼生成的類庫,可以在執行時動態的生成指定類的一個子類物件,並覆蓋其中特定方法並新增增強程式碼,從而實現AOP。CGLIB是通過繼承的方式做的動態代理,因此如果某個類被標記為final,那麼它是無法使用CGLIB做動態代理的。

(3)靜態代理與動態代理區別在於生成AOP代理物件的時機不同,相對來說AspectJ的靜態代理方式具有更好的效能,但是AspectJ需要特定的編譯器進行處理,而Spring AOP則無需特定的編譯器處理。

6、BeanFactory和ApplicationContext有什麼區別?

    BeanFactory和ApplicationContext是Spring的兩大核心介面,都可以當做Spring的容器。

(1)BeanFactory是Spring裡面最底層的介面,是IoC的核心,定義了IoC的基本功能,包含了各種Bean的定義、載入、例項化,依賴注入和生命週期管理。ApplicationContext介面作為BeanFactory的子類,除了提供BeanFactory所具有的功能外,還提供了更完整的框架功能:

繼承MessageSource,因此支援國際化。
資原始檔訪問,如URL和檔案(ResourceLoader)。
載入多個(有繼承關係)上下文(即同時載入多個配置檔案) ,使得每一個上下文都專注於一個特定的層次,比如應用的web層。
提供在監聽器中註冊bean的事件。
(2)①BeanFactroy採用的是延遲載入形式來注入Bean的,只有在使用到某個Bean時(呼叫getBean()),才對該Bean進行載入例項化。這樣,我們就不能提前發現一些存在的Spring的配置問題。如果Bean的某一個屬性沒有注入,BeanFacotry載入後,直至第一次使用呼叫getBean方法才會丟擲異常。

    ②ApplicationContext,它是在容器啟動時,一次性建立了所有的Bean。這樣,在容器啟動時,我們就可以發現Spring中存在的配置錯誤,這樣有利於檢查所依賴屬性是否注入。 

    ③ApplicationContext啟動後預載入所有的單例項Bean,所以在執行的時候速度比較快,因為它們已經建立好了。相對於BeanFactory,ApplicationContext 唯一的不足是佔用記憶體空間,當應用程式配置Bean較多時,程式啟動較慢。

(3)BeanFactory和ApplicationContext都支援BeanPostProcessor、BeanFactoryPostProcessor的使用,但兩者之間的區別是:BeanFactory需要手動註冊,而ApplicationContext則是自動註冊。

(4)BeanFactory通常以程式設計的方式被建立,ApplicationContext還能以宣告的方式建立,如使用ContextLoader。

7、Spring Bean的生命週期?

簡單來說,Spring Bean的生命週期只有四個階段:例項化 Instantiation --> 屬性賦值 Populate --> 初始化 Initialization --> 銷燬 Destruction

但具體來說,Spring Bean的生命週期包含下圖的流程:

(1)例項化Bean:

對於BeanFactory容器,當客戶向容器請求一個尚未初始化的bean時,或初始化bean的時候需要注入另一個尚未初始化的依賴時,容器就會呼叫createBean進行例項化。

對於ApplicationContext容器,當容器啟動結束後,通過獲取BeanDefinition物件中的資訊,例項化所有的bean。

(2)設定物件屬性(依賴注入):例項化後的物件被封裝在BeanWrapper物件中,緊接著,Spring根據BeanDefinition中的資訊 以及 通過BeanWrapper提供的設定屬性的介面完成屬性設定與依賴注入。

(3)處理Aware介面:Spring會檢測該物件是否實現了xxxAware介面,通過Aware型別的介面,可以讓我們拿到Spring容器的一些資源:

①如果這個Bean實現了BeanNameAware介面,會呼叫它實現的setBeanName(String beanId)方法,傳入Bean的名字;
②如果這個Bean實現了BeanClassLoaderAware介面,呼叫setBeanClassLoader()方法,傳入ClassLoader物件的例項。
②如果這個Bean實現了BeanFactoryAware介面,會呼叫它實現的setBeanFactory()方法,傳遞的是Spring工廠自身。
③如果這個Bean實現了ApplicationContextAware介面,會呼叫setApplicationContext(ApplicationContext)方法,傳入Spring上下文;
(4)BeanPostProcessor前置處理:如果想對Bean進行一些自定義的前置處理,那麼可以讓Bean實現了BeanPostProcessor介面,那將會呼叫postProcessBeforeInitialization(Object obj, String s)方法。

(5)InitializingBean:如果Bean實現了InitializingBean介面,執行afeterPropertiesSet()方法。

(6)init-method:如果Bean在Spring配置檔案中配置了 init-method 屬性,則會自動呼叫其配置的初始化方法。

(7)BeanPostProcessor後置處理:如果這個Bean實現了BeanPostProcessor介面,將會呼叫postProcessAfterInitialization(Object obj, String s)方法;由於這個方法是在Bean初始化結束時呼叫的,所以可以被應用於記憶體或快取技術;

以上幾個步驟完成後,Bean就已經被正確建立了,之後就可以使用這個Bean了。

(8)DisposableBean:當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean這個介面,會呼叫其實現的destroy()方法;

(9)destroy-method:最後,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動呼叫其配置的銷燬方法。

8、 Spring中bean的作用域:

(1)singleton:預設作用域,單例bean,每個容器中只有一個bean的例項。

(2)prototype:為每一個bean請求建立一個例項。

(3)request:為每一個request請求建立一個例項,在請求完成以後,bean會失效並被垃圾回收器回收。

(4)session:與request範圍類似,同一個session會話共享一個例項,不同會話使用不同的例項。

(5)global-session:全域性作用域,所有會話共享一個例項。如果想要宣告讓所有會話共享的儲存變數的話,那麼這全域性變數需要儲存在global-session中。

9、 Spring中bean的作用域:

(1)singleton:預設作用域,單例bean,每個容器中只有一個bean的例項。

(2)prototype:為每一個bean請求建立一個例項。

(3)request:為每一個request請求建立一個例項,在請求完成以後,bean會失效並被垃圾回收器回收。

(4)session:與request範圍類似,同一個session會話共享一個例項,不同會話使用不同的例項。

(5)global-session:全域性作用域,所有會話共享一個例項。如果想要宣告讓所有會話共享的儲存變數的話,那麼這全域性變數需要儲存在global-session中。

10、Spring的自動裝配:

在spring中,使用autowire來配置自動裝載模式,物件無需自己查詢或建立與其關聯的其他物件,由容器負責把需要相互協作的物件引用賦予各個物件。

(1)在Spring框架xml配置中共有5種自動裝配:

no:預設的方式是不進行自動裝配的,通過手工設定ref屬性來進行裝配bean。
byName:通過bean的名稱進行自動裝配,如果一個bean的 property 與另一bean 的name 相同,就進行自動裝配。
byType:通過引數的資料型別進行自動裝配。
constructor:利用建構函式進行裝配,並且建構函式的引數通過byType進行裝配。
autodetect:自動探測,如果有構造方法,通過 construct的方式自動裝配,否則使用 byType的方式自動裝配。
(2)基於註解的自動裝配方式:

使用@Autowired、@Resource註解來自動裝配指定的bean。在使用@Autowired註解之前需要在Spring配置檔案進行配置,<context:annotation-config />。在啟動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor後置處理器,當容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查詢需要的bean,並裝配給該物件的屬性。在使用@Autowired時,首先在容器中查詢對應型別的bean:

如果查詢結果剛好為一個,就將該bean裝配給@Autowired指定的資料;

如果查詢的結果不止一個,那麼@Autowired會根據名稱來查詢;

如果上述查詢的結果為空,那麼會丟擲異常。解決方法時,使用required=false。

@Autowired可用於:建構函式、成員變數、Setter方法

注:@Autowired和@Resource之間的區別:

(1) @Autowired預設是按照型別裝配注入的,預設情況下它要求依賴物件必須存在(可以設定它required屬性為false)。

(2) @Resource預設是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean才會按照型別來裝配注入。

11、Spring事務的實現方式和實現原理:

Spring事務的本質其實就是資料庫對事務的支援,沒有資料庫的事務支援,spring是無法提供事務功能的。Spring只提供統一事務管理介面,具體實現都是由各資料庫自己實現,資料庫事務的提交和回滾是通過binlog或者undo log實現的。Spring會在事務開始時,根據當前環境中設定的隔離級別,調整資料庫隔離級別,由此保持一致。

(1)Spring事務的種類:

spring支援程式設計式事務管理和宣告式事務管理兩種方式:

①程式設計式事務管理使用TransactionTemplate。

②宣告式事務管理建立在AOP之上的。其本質是通過AOP功能,對方法前後進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前啟動一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。

宣告式事務最大的優點就是不需要在業務邏輯程式碼中摻雜事務管理的程式碼,只需在配置檔案中做相關的事務規則宣告或通過@Transactional註解的方式,便可以將事務規則應用到業務邏輯中,減少業務程式碼的汙染。唯一不足地方是,最細粒度只能作用到方法級別,無法做到像程式設計式事務那樣可以作用到程式碼塊級別。

(2)spring的事務傳播機制:

spring事務的傳播機制說的是,當多個事務同時存在的時候,spring如何處理這些事務的行為。事務傳播機制實際上是使用簡單的ThreadLocal實現的,所以,如果呼叫的方法是在新執行緒呼叫的,事務傳播實際上是會失效的。

① PROPAGATION_REQUIRED:(預設傳播行為)如果當前沒有事務,就建立一個新事務;如果當前存在事務,就加入該事務。

② PROPAGATION_REQUIRES_NEW:無論當前存不存在事務,都建立新事務進行執行。

③ PROPAGATION_SUPPORTS:如果當前存在事務,就加入該事務;如果當前不存在事務,就以非事務執行。‘

④ PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

⑤ PROPAGATION_NESTED:如果當前存在事務,則在巢狀事務內執行;如果當前沒有事務,則按REQUIRED屬性執行。

⑥ PROPAGATION_MANDATORY:如果當前存在事務,就加入該事務;如果當前不存在事務,就丟擲異常。

⑦ PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則丟擲異常。

(3)Spring中的隔離級別:

① ISOLATION_DEFAULT:這是個 PlatfromTransactionManager 預設的隔離級別,使用資料庫預設的事務隔離級別。

② ISOLATION_READ_UNCOMMITTED:讀未提交,允許事務在執行過程中,讀取其他事務未提交的資料。

③ ISOLATION_READ_COMMITTED:讀已提交,允許事務在執行過程中,讀取其他事務已經提交的資料。

④ ISOLATION_REPEATABLE_READ:可重複讀,在同一個事務內,任意時刻的查詢結果都是一致的。

⑤ ISOLATION_SERIALIZABLE:所有事務逐個依次執行。

12、Spring 框架中都用到了哪些設計模式?

(1)工廠模式:Spring使用工廠模式,通過BeanFactory和ApplicationContext來建立物件;

(2)單例模式:Bean預設為單例模式。

(3)代理模式:Spring的AOP功能用到了JDK的動態代理和CGLIB位元組碼生成技術;

(4)模板方法:用來解決程式碼重複的問題。比如.RestTemplate, JmsTemplate, JpaTemplate。

(5)觀察者模式:Spring事件驅動模型就是觀察者模式的一個經典應用。

(6)包裝器設計模式:可以根據客戶的需求能夠動態切換不同的資料來源。比如我們的專案需要連線多個數據庫,客戶在每次訪問中根據需要會去訪問不同的資料庫。

(7)介面卡模式:Spring AOP的增強或通知(Advice)使用到了介面卡模式,Spring MVC中也是用到了介面卡模式適配Controller。
13、Spring MVC 執行流程

第一步:發起請求到前端控制器(DispatcherServlet)

第二步:前端控制器請求HandlerMapping查詢 Handler( 可以根據xml配置、註解進行查詢)

第三步:處理器對映器HandlerMapping向前端控制器返回Handler

第四步:前端控制器呼叫處理器介面卡去執行Handler

第五步:處理器介面卡去執行Handler

第六步:Handler執行完成給介面卡返回ModelAndView

第七步:處理器介面卡向前端控制器返回ModelAndView(ModelAndView是springmvc框架的一個底層物件,包括Model和view)

第八步:前端控制器請求檢視解析器去進行檢視解析(根據邏輯檢視名解析成真正的檢視(jsp))

第九步:檢視解析器向前端控制器返回View

第十步:前端控制器進行檢視渲染( 檢視渲染將模型資料(在ModelAndView物件中)填充到request域)

第十一步:前端控制器向用戶響應結果

作者:java高併發
連結:https://www.jianshu.com/p/a5d960c6f6dd
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。