原貼地址:http://blog.csdn.net/hongxing4hao/archive/2007/02/16/1511248.aspx
一、 IoC(Inversion of control): 控制反轉(zhuǎn)
1、IoC:
概念:控制權(quán)由對(duì)象本身轉(zhuǎn)向容器;由容器根據(jù)配置文件去創(chuàng)建實(shí)例并創(chuàng)建各個(gè)實(shí)例之間的依賴關(guān)系
核心:bean工廠;在Spring中,bean工廠創(chuàng)建的各個(gè)實(shí)例稱作bean
2、bean工廠創(chuàng)建bean的三種方式:
u 通過構(gòu)造方法直接創(chuàng)建:
<bean id=”” class=”bean class name”>
u 通過靜態(tài)工廠方法創(chuàng)建:
<bean id=”” class=”factory class name” factory-method=””>
u 通過非靜態(tài)工廠方法創(chuàng)建:
<bean id=”factory” class=”factory class name”>
<bean id=”” factory-bean=” factory” factory-method=””>
3、Spring中實(shí)現(xiàn)IoC的方式:依賴注入(Dependency Injection)
Spring中依賴注入的兩種方式:
u 通過setter方法注入:
<property name=””></property>
其中,name屬性的取值依setter方法名而定
u 通過構(gòu)造方法注入:
<constructor-arg index=””></ constructor-arg>
其中,index表示構(gòu)造方法中的參數(shù)索引(第一個(gè)參數(shù)索引為0)
4、設(shè)置屬性時(shí)可選的標(biāo)簽:
n value:基本類型(封裝類型)或String類型
n ref:引用工廠中其它的bean
n list:List或數(shù)組類型
n set:Set類型
n map:Map類型
n props:Properties類型
5、自動(dòng)裝配:自動(dòng)將某個(gè)bean 注入到另一個(gè)bean的屬性當(dāng)中
(bean標(biāo)簽的autowire屬性)
6、依賴檢查:檢查bean的屬性是否完成依賴關(guān)系的注入
(bean標(biāo)簽的dependency-check屬性)
7、生命周期方法:
init-method(也可實(shí)現(xiàn)接口org.springframework.beans.factory.InitializingBean)
destroy-method(也可實(shí)現(xiàn)接口DisposableBean)
8、單例bean:默認(rèn)情況下,從bean工廠所取得的實(shí)例為Singleton
(bean的singleton屬性)
9、Aware相關(guān)接口:可以通過實(shí)現(xiàn)Aware接口來獲得Spring所提供的資源
l org.springframework.beans.factory.BeanNameAware
l org.springframework.beans.factory.BeanFactoryAware
l org.springframework.context.ApplicationContextAware
10、ApplicationContext的功能擴(kuò)展:
1)BeanPostProcessor:若想在Spring對(duì)bean完成依賴注入之后,再補(bǔ)充一些后續(xù)操作,則可以定義一個(gè)bean類來實(shí)現(xiàn)接口:org.springframework.beans.factory.config.BeanPostProcessor,然后在配置文件中定義該bean類;從而Spring容器會(huì)在每一個(gè)bean被初始化之前、之后分別執(zhí)行實(shí)現(xiàn)了該接口的bean類的postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法;
2)BeanFactoryPostProcessor:
l CustomEditorConfigurer:可借助實(shí)現(xiàn)了接口java.beans.PropertyEditor的類,并依據(jù)當(dāng)中的實(shí)現(xiàn),將字符串類型轉(zhuǎn)換為指定類型的對(duì)象;
l PropertyPlaceholderConfigurer:可將配置文件中屬性值用“${key}”形式表示,則會(huì)將其值替換成指定的屬性文件中key所對(duì)應(yīng)的value;
l PropertyOverrideConfigurer:可借助該類在指定的屬性文件中設(shè)定一些優(yōu)先的屬性(將忽略配置文件中對(duì)應(yīng)屬性的設(shè)定值);
(注意:屬性文件中設(shè)定屬性值的格式為:beanName.propertyName=value)
3) 國(guó)際化消息的支持:可通過ApplicationContext的getMessage()方法獲得指定資源文件中的消息;配置如下:
<bean
id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename">
<value>first/msg</value>
</property >
</bean>
4) 事件的支持:
可發(fā)布的事件:ApplicationEvent
發(fā)布事件的方法:publishEvent(ApplicationEvent)
事件監(jiān)聽接口:ApplicationListener
11、ApplicationContext管理bean的執(zhí)行階段:
l 創(chuàng)建bean;
l 屬性注入(依賴關(guān)系的注入);
l BeanNameAware接口實(shí)現(xiàn)類的setBeanName()方法;
l BeanFactoryAware接口實(shí)現(xiàn)類的setBeanFactory()方法;
l ApplicationContextAware接口實(shí)現(xiàn)類的setApplicationContext()方法;
l BeanPostProcessor接口實(shí)現(xiàn)類中的postProcessBeforeInitialization()方法;
l InitializingBean接口實(shí)現(xiàn)類的afterPropertiesSet()方法;
l Bean定義文件中init-method屬性所指定的方法;
l BeanPostProcessor接口實(shí)現(xiàn)類中的postProcessAfterInitialization()方法;
12、FactoryBean:用來創(chuàng)建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所生產(chǎn)的產(chǎn)品;getBean(“&myObject”)得到的是FactoryBean實(shí)例本身)
二、AOP(Aspect-Oriented Programming): 面向方面編程
1、代理的兩種方式:
靜態(tài)代理:
l 針對(duì)每個(gè)具體類分別編寫代理類;
l 針對(duì)一個(gè)接口編寫一個(gè)代理類;
動(dòng)態(tài)代理:
針對(duì)一個(gè)方面編寫一個(gè)InvocationHandler,然后借用JDK反射包中的Proxy類為各種接口動(dòng)態(tài)生成相應(yīng)的代理類
2、AOP的主要原理:動(dòng)態(tài)代理
3、AOP中的術(shù)語(yǔ):
l Aspect:方面,層面
l Joinpoint:結(jié)合點(diǎn)、聯(lián)結(jié)點(diǎn);加入業(yè)務(wù)流程的點(diǎn)或時(shí)機(jī)
l Pointcut:切入點(diǎn)、作用點(diǎn);指定某個(gè)方面在哪些聯(lián)結(jié)點(diǎn)織入到應(yīng)用程序中
l Advice:通知、行為;某個(gè)方面的具體實(shí)現(xiàn)
l Advisor:由Pointcut和Advice共同構(gòu)成
4、Pointcut:Spring根據(jù)類名稱及方法名稱定義Pointcut,表示Advice織入至應(yīng)用程序的時(shí)機(jī);
org.springframework.aop.Pointcut
5、ProxyFactoryBean:用來創(chuàng)建代理對(duì)象
<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>
創(chuàng)建代理對(duì)象需指定的三要素:
l target:設(shè)定目標(biāo)對(duì)象(只能是一個(gè));
l proxyInterfaces:設(shè)定代理接口(目標(biāo)對(duì)象所實(shí)現(xiàn)的接口);
l interceptorNames:設(shè)定攔截器的名字(各個(gè)advice或advisor bean的列表)
6、Advice:五種(根據(jù)織入的時(shí)機(jī)不同而劃分)
l Before Advice:在目標(biāo)對(duì)象的方法執(zhí)行之前加入行為;
要實(shí)現(xiàn)的接口:org.springframework.aop.MethodBeforeAdvice
l After Advice:在目標(biāo)對(duì)象的方法執(zhí)行之后加入行為;
要實(shí)現(xiàn)的接口:org.springframework.aop.AfterReturningAdvice
l Throw Advice:在目標(biāo)對(duì)象的方法發(fā)生異常時(shí)加入行為
要實(shí)現(xiàn)的接口:org.springframework.aop.ThrowsAdvice
l Around Advice:在目標(biāo)對(duì)象的方法執(zhí)行前后加入行為
要實(shí)現(xiàn)的接口:org.aopalliance.intercept.MethodInterceptor
l Introduction Advice:引入的行為(增加了可操作的方法)
1. 聲明要添加的功能接口;
2. 創(chuàng)建引入Advice;
(繼承org.springframework.aop.support.DelegatingIntroductionInterceptor,并實(shí)現(xiàn)添加的功能接口)
3. 在配置文件中定義一個(gè)DefaultIntroductionAdvisor的bean
(需要兩個(gè)構(gòu)造方法的參數(shù):Advice和添加的功能接口)
7、PointcutAdvisor:Pointcut定義了Advice的應(yīng)用時(shí)機(jī);在Spring中,使用PointcutAdvisor將Pointcut和Advice結(jié)合為一個(gè)對(duì)象
l NameMatchMethodPointcutAdvisor:可用來指定Advice所要應(yīng)用的目標(biāo)對(duì)象上的方法名稱
<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的情況下應(yīng)用Advice,其pattern屬性用來指定所要符合的完整類名(包括 package名稱)及方法名;定義該屬性時(shí)可使用的符號(hào)包括:
符號(hào)
描述
.
符合任意一個(gè)字符
+
符合前一個(gè)字符一次或多次
*
符合前一個(gè)字符零次或多次
\
轉(zhuǎn)義字符,用來轉(zhuǎn)義正則表達(dá)式中使用到的字符
<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:自動(dòng)代理
l BeanNameAutoProxyCreator:根據(jù)bean的名字為其自動(dòng)創(chuàng)建代理對(duì)象,bean工廠自動(dòng)返回其代理對(duì)象:
<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:自動(dòng)將Advisor應(yīng)用到符合Pointcut的目標(biāo)對(duì)象上
<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:作為前端控制器,負(fù)責(zé)分發(fā)客戶的請(qǐng)求到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:負(fù)責(zé)處理客戶請(qǐng)求,并返回ModelAndView實(shí)例;
Controller必須實(shí)現(xiàn)接口org.springframework.web.servlet.mvc.Controller,實(shí)現(xiàn)該接口中的方法handleRequest(),在該方法中處理請(qǐng)求,并返回ModelAndView實(shí)例
3、HandlerMapping:DispatcherServlet根據(jù)它來決定請(qǐng)求由哪一個(gè)Controller處理;
l 默認(rèn)情況下,DispatcherServlet將使用org.springframework.web.servlet.handler. BeanNameUrlHandlerMapping,即使用和客戶請(qǐng)求的URL名稱一致的Controller的bean實(shí)例來處理請(qǐng)求;
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”屬性設(shè)置中,“key”為請(qǐng)求的URL,而“value”為處理請(qǐng)求的Controller的bean名稱
4、ModelAndView:用來封裝View與呈現(xiàn)在View中的Model對(duì)象;
DispatcherServlet根據(jù)它來解析View名稱,并處理呈現(xiàn)在View中的Model對(duì)象
5、ViewResolver:DispatcherServlet委托ViewResolver來解析View名稱;
常用的ViewResolver實(shí)例配置如下:
<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 閱讀(2967)
評(píng)論(3) 編輯 收藏 所屬分類:
Spring