原貼地址:http://blog.csdn.net/hongxing4hao/archive/2007/02/16/1511248.aspx
一、 IoC(Inversion of control): 控制反轉
1、IoC:
概念:控制權由對象本身轉向容器;由容器根據配置文件去創建實例并創建各個實例之間的依賴關系
核心:bean工廠;在Spring中,bean工廠創建的各個實例稱作bean
2、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=””>
3、Spring中實現IoC的方式:依賴注入(Dependency Injection)
Spring中依賴注入的兩種方式:
u 通過setter方法注入:
<property name=””></property>
其中,name屬性的取值依setter方法名而定
u 通過構造方法注入:
<constructor-arg index=””></ constructor-arg>
其中,index表示構造方法中的參數索引(第一個參數索引為0)
4、設置屬性時可選的標簽:
n value:基本類型(封裝類型)或String類型
n ref:引用工廠中其它的bean
n list:List或數組類型
n set:Set類型
n map:Map類型
n props:Properties類型
5、自動裝配:自動將某個bean 注入到另一個bean的屬性當中
(bean標簽的autowire屬性)
6、依賴檢查:檢查bean的屬性是否完成依賴關系的注入
(bean標簽的dependency-check屬性)
7、生命周期方法:
init-method(也可實現接口org.springframework.beans.factory.InitializingBean)
destroy-method(也可實現接口DisposableBean)
8、單例bean:默認情況下,從bean工廠所取得的實例為Singleton
(bean的singleton屬性)
9、Aware相關接口:可以通過實現Aware接口來獲得Spring所提供的資源
l org.springframework.beans.factory.BeanNameAware
l org.springframework.beans.factory.BeanFactoryAware
l org.springframework.context.ApplicationContextAware
10、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
11、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()方法;
12、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實例本身)
二、AOP(Aspect-Oriented Programming): 面向方面編程
1、代理的兩種方式:
靜態代理:
l 針對每個具體類分別編寫代理類;
l 針對一個接口編寫一個代理類;
動態代理:
針對一個方面編寫一個InvocationHandler,然后借用JDK反射包中的Proxy類為各種接口動態生成相應的代理類
2、AOP的主要原理:動態代理
3、AOP中的術語:
l Aspect:方面,層面
l Joinpoint:結合點、聯結點;加入業務流程的點或時機
l Pointcut:切入點、作用點;指定某個方面在哪些聯結點織入到應用程序中
l Advice:通知、行為;某個方面的具體實現
l Advisor:由Pointcut和Advice共同構成
4、Pointcut:Spring根據類名稱及方法名稱定義Pointcut,表示Advice織入至應用程序的時機;
org.springframework.aop.Pointcut
5、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的列表)
6、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和添加的功能接口)
7、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>
8、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"/>
三、Spring的Web MVC:
1、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>
2、Controller:負責處理客戶請求,并返回ModelAndView實例;
Controller必須實現接口org.springframework.web.servlet.mvc.Controller,實現該接口中的方法handleRequest(),在該方法中處理請求,并返回ModelAndView實例
3、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名稱
4、ModelAndView:用來封裝View與呈現在View中的Model對象;
DispatcherServlet根據它來解析View名稱,并處理呈現在View中的Model對象
5、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>
四、Spring Data Access
1、Template
2、Dao Support
3、Transaction Manager
4、Transaction Proxy
posted on 2007-04-17 10:58
OMG 閱讀(2968)
評論(3) 編輯 收藏 所屬分類:
Spring