- 1、 IoC(Inversion of control): 控制反轉
- 一、IoC:
- 概念:控制權由對象自己轉向容器;由容器根據配置文件去建立實例並建立各個實例之間的依賴關係
- 核心:bean工廠;在Spring中,bean工廠建立的各個實例稱做bean
- 二、bean工廠建立bean的三種方式:
- u 經過構造方法直接建立:
- <bean id=」」 class=」bean class name」>
- u 經過靜態工廠方法建立:
- <bean id=」」 class=」factory class name」 factory-method=」」>
- u 經過非靜態工廠方法建立:
- <bean id=」factory」 class=」factory class name」>
- <bean id=」」 factory-bean=」 factory」 factory-method=」」>
- 三、Spring中實現IoC的方式:依賴注入(Dependency Injection)
- Spring中依賴注入的兩種方式:
- u 經過setter方法注入:
- <property name=」」></property>
- 其中,name屬性的取值依setter方法名而定
- u 經過構造方法注入:
- <constructor-arg index=」」></ constructor-arg>
- 其中,index表示構造方法中的參數索引(第一個參數索引爲0)
- 四、設置屬性時可選的標籤:
- n value:基本類型(封裝類型)或String類型
- n ref:引用工廠中其它的bean
- n list:List或數組類型
- n set:Set類型
- n map:Map類型
- n props:Properties類型
- 五、自動裝配:自動將某個bean 注入到另外一個bean的屬性當中
- (bean標籤的autowire屬性)
- 六、依賴檢查:檢查bean的屬性是否完成依賴關係的注入
- (bean標籤的dependency-check屬性)
- 七、生命週期方法:
- init-method(也可實現接口org.springframework.beans.factory.InitializingBean)
- destroy-method(也可實現接口DisposableBean)
- 八、單例bean:默認狀況下,從bean工廠所取得的實例爲Singleton
- (bean的singleton屬性)
- 九、Aware相關接口:能夠經過實現Aware接口來得到Spring所提供的資源
- l org.springframework.beans.factory.BeanNameAware
- l org.springframework.beans.factory.BeanFactoryAware
- l org.springframework.context.ApplicationContextAware
- 十、ApplicationContext的功能擴展:
- 1)BeanPostProcessor:若想在Spring對bean完成依賴注入以後,再補充一些後續操做,則能夠定義一個bean類來實現接口:org.springframework.beans.factory.config.BeanPostProcessor,而後在配置文件中定義該bean類;從而Spring容器會在每個bean被初始化以前、以後分別執行實現了該接口的bean類的postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法;
- 2)BeanFactoryPostProcessor:
- l CustomEditorConfigurer:可藉助實現了接口java.beans.PropertyEditor的類,並依據當中的實現,將字符串類型轉換爲指定類型的對象;
- l PropertyPlaceholderConfigurer:可將配置文件中屬性值用「${key}」形式表示,則會將其值替換成指定的屬性文件中key所對應的value;
- l PropertyOverrideConfigurer:可藉助該類在指定的屬性文件中設定一些優先的屬性(將忽略配置文件中對應屬性的設定值);
- (注意:屬性文件中設定屬性值的格式爲:beanName.propertyName=value)
- 3) 國際化消息的支持:可經過ApplicationContext的getMessage()方法得到指定資源文件中的消息;配置以下:
- <bean
- id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
- <property name="basename">
- <value>first/msg</value>
- </property >
- </bean>
- 4) 事件的支持:
- 可發佈的事件:ApplicationEvent
- 發佈事件的方法:publishEvent(ApplicationEvent)
- 事件監聽接口:ApplicationListener
- 十一、ApplicationContext管理bean的執行階段:
- l 建立bean;
- l 屬性注入(依賴關係的注入);
- l BeanNameAware接口實現類的setBeanName()方法;
- l BeanFactoryAware接口實現類的setBeanFactory()方法;
- l ApplicationContextAware接口實現類的setApplicationContext()方法;
- l BeanPostProcessor接口實現類中的postProcessBeforeInitialization()方法;
- l InitializingBean接口實現類的afterPropertiesSet()方法;
- l Bean定義文件中init-method屬性所指定的方法;
- l BeanPostProcessor接口實現類中的postProcessAfterInitialization()方法;
- 十二、FactoryBean:用來建立bean
- <bean id="myObject"
- class="org.springframework.beans.factory.config.
- MethodInvokingFactoryBean">
- <property name="staticMethod">
- <value>com.whatever.MyClassFactory.getInstance</value>
- </property>
- </bean>
- (注意:經過bean工廠的getBean(「myObject」)獲得的是FactoryBean所生產的產品;getBean(「&myObject」)獲得的是FactoryBean實例自己)
- 2、AOP(Aspect-Oriented Programming): 面向方面編程
- 一、代理的兩種方式:
- 靜態代理:
- l 針對每一個具體類分別編寫代理類;
- l 針對一個接口編寫一個代理類;
- 動態代理:
- 針對一個方面編寫一個InvocationHandler,而後借用JDK反射包中的Proxy類爲各類接口動態生成相應的代理類
- 二、AOP的主要原理:動態代理
- 三、AOP中的術語:
- l Aspect:方面,層面
- l Joinpoint:結合點、聯結點;加入業務流程的點或時機
- l Pointcut:切入點、做用點;指定某個方面在哪些聯結點織入到應用程序中
- l Advice:通知、行爲;某個方面的具體實現
- l Advisor:由Pointcut和Advice共同構成
- 四、Pointcut:Spring根據類名稱及方法名稱定義Pointcut,表示Advice織入至應用程序的時機;
- org.springframework.aop.Pointcut
- 五、ProxyFactoryBean:用來建立代理對象
- <bean id="proxy"
- class="org.springframework.aop.framework.ProxyFactoryBean">
- <property name="target">
- <ref bean="target bean"/>
- </property>
- <property name="proxyInterfaces">
- <list>
- <value>interfaces of target bean implemented</value>
- </list>
- </property>
- <property name="interceptorNames">
- <list>
- <value>Advice/Advisor bean</value>
- </list>
- </property>
- </bean>
- 建立代理對象需指定的三要素:
- l target:設定目標對象(只能是一個);
- l proxyInterfaces:設定代理接口(目標對象所實現的接口);
- l interceptorNames:設定攔截器的名字(各個advice或advisor bean的列表)
- 六、Advice:五種(根據織入的時機不一樣而劃分)
- l Before Advice:在目標對象的方法執行以前加入行爲;
- 要實現的接口:org.springframework.aop.MethodBeforeAdvice
- l After Advice:在目標對象的方法執行以後加入行爲;
- 要實現的接口:org.springframework.aop.AfterReturningAdvice
- l Throw Advice:在目標對象的方法發生異常時加入行爲
- 要實現的接口:org.springframework.aop.ThrowsAdvice
- l Around Advice:在目標對象的方法執行先後加入行爲
- 要實現的接口:org.aopalliance.intercept.MethodInterceptor
- l Introduction Advice:引入的行爲(增長了可操做的方法)
- 1. 聲明要添加的功能接口;
- 2. 建立引入Advice;
- (繼承org.springframework.aop.support.DelegatingIntroductionInterceptor,並實現添加的功能接口)
- 3. 在配置文件中定義一個DefaultIntroductionAdvisor的bean
- (須要兩個構造方法的參數:Advice和添加的功能接口)
- 七、PointcutAdvisor:Pointcut定義了Advice的應用時機;在Spring中,使用PointcutAdvisor將Pointcut和Advice結合爲一個對象
- l NameMatchMethodPointcutAdvisor:可用來指定Advice所要應用的目標對象上的方法名稱
- <bean id="nameAdvisor"
- class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
- <property name="mappedName">
- <value>do*</value>
- </property>
- <property name="advice">
- <ref local="AdviceBeanName"/>
- </property>
- </bean>
- l RegexpMethodPointcutAdvisor:可以使用Regular expression定義Pointcut,在符合Regular expression的狀況下應用Advice,其pattern屬性用來指定所要符合的完整類名(包括 package名稱)及方法名;定義該屬性時可以使用的符號包括:
- 符號
- 描述
- .
- 符合任意一個字符
- +
- 符合前一個字符一次或屢次
- *
- 符合前一個字符零次或屢次
- /
- 轉義字符,用來轉義正則表達式中使用到的字符
- <bean id="regexpAdvisor"
- class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
- <property name="pattern">
- <value>.*do.*</value>
- </property>
- <property name="advice">
- <ref local="AdviceBeanName"/>
- </property>
- </bean>
- 八、AutoProxy:自動代理
- l BeanNameAutoProxyCreator:根據bean的名字爲其自動建立代理對象,bean工廠自動返回其代理對象:
- <bean
- class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="beanNames">
- <list>
- <value>beanName</value>
- </list>
- </property>
- <property name="interceptorNames">
- <list>
- <value>Advice/Advisor Bean Name</value>
- </list>
- </property>
- </bean>
- l DefaultAdvisorAutoProxyCreator:自動將Advisor應用到符合Pointcut的目標對象上
- <bean id="regexpAdvisor"
- class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
- <property name="pattern">
- <value>.*do.*</value>
- </property>
- <property name="advice"><ref local="AdviceName"/></property>
- </bean>
- <bean
- class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
- 3、Spring的Web MVC:
- 一、DispatcherServlet:做爲前端控制器,負責分發客戶的請求到Controller;
- 在web.xml中的配置以下:
- <servlet>
- <servlet-name>mvc</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/mvc-servlet.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>mvc</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
- 二、Controller:負責處理客戶請求,並返回ModelAndView實例;
- Controller必須實現接口org.springframework.web.servlet.mvc.Controller,實現該接口中的方法handleRequest(),在該方法中處理請求,並返回ModelAndView實例
- 三、HandlerMapping:DispatcherServlet根據它來決定請求由哪個Controller處理;
- l 默認狀況下,DispatcherServlet將使用org.springframework.web.servlet.handler. BeanNameUrlHandlerMapping,即便用和客戶請求的URL名稱一致的Controller的bean實例來處理請求;
- l 另一種經常使用的HandlerMapping爲org.springframework.web.servlet.handler. SimpleUrlHandlerMapping,配置以下:
- <bean
- class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="mappings">
- <props>
- <prop key="/add.do">add</prop>
- </props>
- </property>
- </bean>
- 在以上「mappings」屬性設置中,「key」爲請求的URL,而「value」爲處理請求的Controller的bean名稱
- 四、ModelAndView:用來封裝View與呈如今View中的Model對象;
- DispatcherServlet根據它來解析View名稱,並處理呈如今View中的Model對象
- 五、ViewResolver:DispatcherServlet委託ViewResolver來解析View名稱;
- 經常使用的ViewResolver實例配置以下:
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix">
- <value>/</value>
- </property>
- <property name="suffix">
- <value>.jsp</value>
- </property>
- </bean>
- 4、Spring Data Access
- 一、Template
- 二、Dao Support
- 三、Transaction Manager
- 四、Transaction Proxy