spring in action 读书笔记
IOC?
?
??1.幾個(gè)主要使用的application context. ?
??ClassPathXmlApplicationContext? 從ClassPath路徑加載?
??FileSystemXmlApplicationContext ?從文件系統(tǒng)路徑加載
??XmlWebApplicationContext ? 配置文件黑夜在/WEB-INF/applicationContext.xml,也可以使用setConfigLocation(location)修 改。另外一定還要通過setServletContext設(shè)置ServletContext對(duì)象
2. ?一個(gè)bean的生命周期
3. spring配置文件的namespace有beans,sop,context,mvc,jms,tx等,通過指定xml配置文件的schema來表明當(dāng)前配置文件主要用來配置哪些
4 一個(gè)bean的scope有singleton,prototype,request,session,global-session幾種
5. ?spring ioc可以通過方法和屬于進(jìn)行注入,注入的類型可以為一個(gè)具體的值,類型可以為list,map,set,prop ,null,也可以是對(duì)另外一個(gè)bean的引用,也可以是一個(gè)inner bean,還可以是SpEL語言,比如:
??<property name=”remainder” value=”#{counter.total % counter.count}”/>
?
6. ?spring的autowiring的類型有byName,byType,constructor,auto detect.
7. ?spring的annotations有 @Component @Controller ?@Respository ?@Service ? @Bean ?@Autowired等
? ? ?在spirng context配置中可配 ?<context:annotation-config />?? <context:component-scan>
AOP?
aop相關(guān)概念 ?http://www.cnblogs.com/dlts26/archive/2013/04/17/2742628.html?
aop面向切面可以用于統(tǒng)一日志記錄、安全控制、緩存等
spring aop只能控制到方法級(jí)別,如果需要控制到屬性,構(gòu)造函數(shù)級(jí)別,需要使用Aspectj. aspject提供了自己的語言,基于java擴(kuò)展的。
spring aop是在運(yùn)行時(shí)注入的,對(duì)性能會(huì)有影響。而Aspectj支持編譯注入。
spirng aop的可在pointcut時(shí)使用表達(dá)式,與Aspject類似。強(qiáng)大的表達(dá)式可指定切入哪些包的哪些類的哪些方法。
spring aop支持的Advice有befor,after,after-returning,after-throwing,around.
可傳遞參數(shù)到advice.
基于aop機(jī)制,可實(shí)現(xiàn)不修改源代碼的情況下,指定類實(shí)現(xiàn)某接口,其接口的方法由哪個(gè)類來實(shí)現(xiàn),實(shí)際上這個(gè)時(shí)候bean由proxy攔截了調(diào)用.
基于annotation能夠減少大量的代碼的情況下,方便的實(shí)現(xiàn)aop聲明.
database
Spring基于模板方法的Template機(jī)制,把大量重復(fù)不變的數(shù)據(jù)庫連接,異常處理等封裝起來,而讓spring只需要簡單的處理業(yè)務(wù)相 關(guān)的數(shù)據(jù)訪問。Spring DAO對(duì)不同的數(shù)據(jù)實(shí)現(xiàn)的異常進(jìn)行了高度集成,這樣在使用Hibernate,JPA等框架的時(shí)候,頂層不需要耦合其提供的異常信息?
?
在生產(chǎn)環(huán)境中一定要使用基于緩存池pool的datasource機(jī)制,如果能使用JNDI,盡量使用JNDJ數(shù)據(jù)源,能夠充分利用app server提供的緩存池,而且易于監(jiān)控
Spring針對(duì)不同的持久層機(jī)制提供了不同的Template以及不同的DAO Support classes.
選擇的持久層機(jī)制要充分考慮到性能,Hibernate后續(xù)提升性能不如原生JDBC方便.
Transaction
?聲明式事務(wù) 程序事務(wù),annotation事務(wù)
事務(wù)的隔離級(jí)別 ?isolation ??http://zh.wikipedia.org/wiki/%E4%BA%8B%E5%8B%99%E9%9A%94%E9%9B%A2
Spring針對(duì)不同的底層提供不同的TransactionManger,Ibatis和Jdbc一樣使用 DataSourceTransactionManger
Propagation可設(shè)置事務(wù)傳遞機(jī)制,是否支持事務(wù),是否需要新創(chuàng)建事務(wù)等.
對(duì)應(yīng)C#中的Transaction機(jī)制如下:
http://progtutorials.tripod.com/DotNetTransaction.htm
? [Transaction(?TransactionOption.Supported, Isolation =?TransactionIsolationLevel?.Any, Timeout = 1800)]?
原理類似:
一個(gè)事務(wù)協(xié)調(diào)器transaction coordinator負(fù)責(zé)事務(wù)協(xié)調(diào),不同的數(shù)據(jù)資源提供不同的事務(wù)接口,mysql,oracle,mssql分別都會(huì)有自己的事務(wù)機(jī)制,在一個(gè)事務(wù)執(zhí) 行時(shí),當(dāng)所有的資源都返回正確時(shí),coordiantor再讓每個(gè)資源commit,如果有任何一個(gè)出現(xiàn)問題,都讓每個(gè)資源roolback.
每個(gè)資源需要記錄自己執(zhí)行過的操作,以便rooback.
?
Spring MVC
?
?
1. 象其它MVC框架一樣(struts2是基于filter的,struts1.x是基于servlet的),Spring MVC也是通過一個(gè)Servlet(DispatcherServlet)負(fù)責(zé)接收請(qǐng)求,再轉(zhuǎn)發(fā)調(diào)用Spring自己的Action,Action內(nèi)部執(zhí) 行完成后,會(huì)返回需要顯示的視圖名稱,DispatcherServlet會(huì)根據(jù)當(dāng)前的不同的視圖引擎來呈現(xiàn)視圖.
2. DispatcherServlet需要在web.xml里配置,并且配置接受哪些請(qǐng)求,同時(shí)會(huì)根據(jù)名字-servlet.xml加載對(duì)應(yīng)的配置文件
<servlet>
<servlet-name>spitter</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spitter</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
對(duì)應(yīng)的配置文件就是spitter-Servlet.xml
3. Spring mvc 使用基于annotation方式,大量減少代碼 @Controller ?@RequestMapping
4. 可對(duì)應(yīng)Controller創(chuàng)建Test項(xiàng)目,結(jié)合Mock測(cè)試,@Test
5. Spring mvc前臺(tái)支持不同的View Resolver ,Freemarker ,Velocity, Apache Tite,JasperReport, ? InternalResolverViewResolver通常使用
6. Tite能夠定義頁面布局,功能強(qiáng)大
7. 需要在web.xml里配置ContextLoaderListener,以便能夠同時(shí)加載Service層以及其它的spring配置文件。
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
默認(rèn)去 WEB-INF目錄下尋找applicationContext.xml ?當(dāng)然也可以通過context-param配置加載指定的多個(gè)xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spitter-security.xml
classpath:service-context.xml
classpath:persistence-context.xml
classpath:dataSource-context.xml
</param-value>
</context-param>
8.Spring mvc中可以給整個(gè)Controller設(shè)置RequestMapping,規(guī)定這個(gè)Controller接受這個(gè)請(qǐng)求后的處理
9. 可在action的參數(shù)上直接打標(biāo)簽@Valid,這樣能夠?qū)τ成溥^來的實(shí)體進(jìn)行驗(yàn)證,前臺(tái)通過標(biāo)簽直接顯示錯(cuò)誤信息
10. 在Spring mvc中進(jìn)行文件上傳時(shí),同時(shí)需要配置CommonsMultipartResolver
? ??<bean id=”multipartResolver” class=
“org.springframework.web.multipart.commons.CommonsMultipartResolver”
p:maxUploadSize=”500000″ />
Spring Security
1.Spring Security主要處理兩種場(chǎng)景,一種是控制到URL級(jí)別,主要針對(duì)用戶請(qǐng)求,基于Servlet Filter控制,另外一種是控制web invocation,基于AOP實(shí)現(xiàn)?
2. Securing Web Request.
? ?在web.xml配置spring的filter代理
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
然后在spring配置文件里配置規(guī)則:
<http>
<form-login />
<http-basic />
<logout />
<intercept-url pattern=”/**” access=”ROLE_SPITTER” />
</http>
也可以指定自己的登錄界面,登錄提交url,以及控制的路徑,允許訪問的角色
3.Spring提供了前臺(tái)標(biāo)簽,可直接在前臺(tái)讀取當(dāng)前登錄用戶的一些認(rèn)證信息,也可以讀取權(quán)限來區(qū)分顯示一些前臺(tái)內(nèi)容。
4.Spring判斷用戶登錄以及獲取用戶權(quán)限支持靈活的擴(kuò)展,可支持配置文件,JDBC,LDAP, OpenID等
5.全局開啟方法annotation安全驗(yàn)證
<global-method-security secured-annotations=”enabled” />
可直接利用標(biāo)簽通過AOP機(jī)制對(duì)方法進(jìn)行安全驗(yàn)證。
甚至可以直接控制方法訪問,通常情況下不符合的話返回異常,也支持直接退出,還可以對(duì)返回結(jié)果進(jìn)行過濾
可通過實(shí)現(xiàn)接口PermissionEvaluator的方法hasPermission,這樣在@PostFilter中可直接控制指定的權(quán)限
需要同時(shí)配置ExpressionHandler
<global-method-security pre-post-annotations=”enabled”>
<expression-handler ref=”expressionHandler”/>
</global-method-security>
<beans:bean id=”expressionHandler” class=
“org.springframework.security.access.expression.method.?DefaultMethodSecurityExpressionHandler”>
<beans:property name=”permissionEvaluator”>
<beans:bean class=
“com.habuma.spitter.security.SpittlePermissionEvaluator” />
</beans:property>
</beans:bean>
Spring Remoting
?
rpc ?? remote ?procedure call
Spring ?supports ? rpc ? via ?several ?remoting ? technologies:?
Remote ?Method ?Invocation (RMI) ? firewalls aren’t ?a factor
Hessian ?or ? Burlap
HTTP ?invoker
JAX_RPC ?and JAX-WS
?Rest
?
1 .?
? ?Rest == ?Representational State Transfer?
? ? ? ? ?Representational ? ? => ?resources可以為多種表現(xiàn)形式 html ?xml json等
2. ?Rest Verbs ? Post ?Get ?Delete Put ?Option…
3. Spring Mvc在Action中通過@RequestMapping ? 設(shè)置method控制不同的Verb,通過header要求返回的格式,
4. 可以直接通過@ResponseStatus 返回結(jié)果狀態(tài)
5.
? ? ?@RequestMapping(value=”/{username}”,method=RequestMethod.GET,headers={“Accept=text/xml,application/json”})
? public ?@RequestBody Spliter ? GetSpliter()
? ? ? ? ?在這里springmvc或根據(jù)header的值,自動(dòng)根據(jù)指定的convert返回對(duì)應(yīng)的結(jié)果
6. 通過RestTemplate完成RestClient的工作
7. submit restful form 通過設(shè)置隱藏屬性_method, 值為Delete,PUT的方式,實(shí)際上還是提交的Post請(qǐng)求。
通過在在 DispatcherServlet前設(shè)置 HiddenHttpMethodFilter來攔截
?JMS
?
1.系統(tǒng)間同步通信的問題: ?synchronous communication
? ? ? ? a. 受服務(wù)端請(qǐng)求能力限制,影響client的性能
? ? ? ? b. ? 直接基于接口開發(fā),接口變化時(shí)會(huì)產(chǎn)生影響
? ? ? ? c. client直接指定了service的地址
? ? ? ? d. ? ? ?client依賴于service的可用性,如果不可用時(shí)會(huì)馬上受到影響
? ?這些問題也是asynchronous的優(yōu)勢(shì)
2. 可選擇ActiveMQ作為Message Broker
3. 基于JMSTemplate開發(fā)message send
4. ? 為了解決同步receive,基于Message Listener實(shí)現(xiàn)消息到達(dá)時(shí)主動(dòng)通知
<jms:listener-container connection-factory=”connectionFactory”>
<jms:listener destination=”spitter.alert.queue”
ref=”spittleHandler” method=”processSpittle” />
</jms:listener-container>
5. 可以把JMS和remoting service調(diào)用(rpc)相結(jié)合
JMX
?
1. 使用JMX技術(shù)可以管理Spring中的bean,比如運(yùn)行時(shí)設(shè)置一個(gè)bean的屬性的值, JMX+JConsole?
? 同時(shí)JMX主要用于監(jiān)控運(yùn)行時(shí)Spring ?bean的屬性
2.?<bean id=”assembler”
class=”org.springframework.jmx.export.assembler.
MethodNameBasedMBeanInfoAssembler”
p:managedMethods=”getSpittlesPerPage,setSpittlesPerPage” />
<bean id=”mbeanExporter”
class=”org.springframework.jmx.export.MBeanExporter”>
<property name=”beans”>
<map>
<entry key=”spitter:name=HomeController”
value-ref=”homeController”/>
</map>
</property>
<property name=”server” ref=”mbeanServer” />
<property name=”assembler” ref=”assembler”/>
</bean>
3.基于annnocation方式
<context:mbean-export server=”mbeanServer” />
@ManagedResource(objectName=”spitter:name=HomeController”)
@ManagedOperation
@ManagedAttribute
Odds?
1. 使用spring中的配置單獨(dú)出來,放到properties文件中
? ? ? ??<context:property-placeholder ? ?location=”classpath:/db.properties” />
? ? ? ? ? ?<bean id=”dataSource”
??? class=”org.springframework.jdbc.d
???? p:driverClassName=”${jdbc.driverC
???? p:url=”${jdbc.url}”
???? p:username=”${jdbc.username}”
???? p:password=”${jdbc.password}” />
? ?或者是annotation形式
? ? ? @Value(“${jdbc.url}”)
? ??String databaseUrl;
? ? ? ? 這樣只需要修改properties文件就可以
? ?Jasypt project可用于一些加密工作,可用于配置文件的加密
2. ? ?JNDI ? ? ?Java Naming and Directory Interface
? ? ? 主要用于存儲(chǔ)和取對(duì)象,比如data source, transaction manager
<jee:jndi-lookup id=”dataSource”
jndi-name=”/jdbc/SpitterDS”
resource-ref=”true”
cache=”false” ? ? //禁用緩存,不然改變必須重新啟動(dòng)
lookup-on-startup=”false” ? // ?延遲加載
proxy-interface=”javax.sql.DataSource” />
可以通過設(shè)置default-ref,當(dāng)從JNDI獲取失敗時(shí),能夠使用默認(rèn)值
3. ? 可配置使用org.springframework.mail.javamail.JavaMailSenderImpl發(fā)郵件
? ? ? 可以基于VelocityEngine實(shí)現(xiàn)郵件內(nèi)容模板化
4. ?兩種background ?jobs方案
? ? ? ? ? ?? Scheduled jobs
Asynchronous methods
? 在spring配置文件中<task:annotation-driven/> 然后通過@Scheduled和 @Async來實(shí)現(xiàn)
? @Async適合?這種“即發(fā)即忘”(fire-and-forget)情況,比如前臺(tái)請(qǐng)求后后臺(tái)直接自己處理就行了
轉(zhuǎn)載于:https://blog.51cto.com/lonely7345/1428102
總結(jié)
以上是生活随笔為你收集整理的spring in action 读书笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web前端-HTML 媒体插件 022
- 下一篇: 如何根据MAC地址获取设备厂商