javascript
Spring Aop 日志管理及配置文件的详细配置
?
Spring 帶給我們的另一個(gè)好處就是讓我們可以“專心做事”,下面我們來看下面一個(gè)例子:
public void doSameSomesing(int age,String name){
// 記錄日志
log.info("調(diào)用 doSameSomesing方法,參數(shù)是:"+agfe+” ”+name);
// 輸入合法性驗(yàn)證
if (age<=0){
throws new IllegalArgumentException("age應(yīng)該大于0");
}
if (name==null || name.trim().equals("")){
throws new IllegalArgumentException("name不能為空");
}
// 異常處理
try{ ...
service.save(age,name);//業(yè)務(wù)處理存數(shù)據(jù)
}catch(...){
}catch(...){
}
// 事務(wù)控制
tx.commit();
}
大家想一下我們構(gòu)建系統(tǒng)的主要目的是業(yè)務(wù)處理,但是我們在完成上面業(yè)務(wù)前需要解決如日志記錄,參數(shù)驗(yàn)證等如此多方面的事情,這樣的話留給我們考慮業(yè)務(wù)的時(shí)間就少了,使我們的業(yè)務(wù)代碼質(zhì)量得不到很好的保證,而這些方面又是不可缺少的我們不能不管,那么怎么辦呢,我們能不能集中對這些方面進(jìn)行一個(gè)統(tǒng)一的管理,當(dāng)然可以,這就是spring aop要解決的問題。下面我們來看一個(gè)簡單的例子,通過spring aop來集中解決日志方面的事情。
下面我們按照下面幾個(gè)步驟去做:
1、 定義并實(shí)現(xiàn)對日志方面的處理。
package com.springaop.aop;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Date;
import org.springframework.aop.MethodBeforeAdvice;
public class LogAdvice implements MethodBeforeAdvice{
public void before(Method method, Object[] args, Object o)
throws Throwable {
System.out.println("系統(tǒng)日志:"+(new Date())+":"+"調(diào)用了"+method.getName()+" :使用了參數(shù)"+(Arrays.toString(args)));
}
}
(注意這里我們要實(shí)現(xiàn)MethodBeforeAdvice接口 指的是在方法執(zhí)行前織入執(zhí)行,類似還有AfterReturningAdvice)
2、 定義業(yè)務(wù)代碼
2.1 業(yè)務(wù)接口
package com.springaop.service;
public interface IAopMethod {
public void doSomesing(String name);
}
2.2 業(yè)務(wù)實(shí)現(xiàn)類
package com.springaop.service.impl;
import com.springaop.service.IAopMethod;
public class AopMethodimpl implements IAopMethod {
public void doSomesing(String name) {
System.out.println("name:"+name);
}
}
3.配置applicationContext.xml.
<!--處理日志方面的bean-->
<bean name="mylogadvice" class="com.springaop.aop.LogAdvice"></bean>
<!--處理業(yè)務(wù)的bean-->
<bean name="aopmethodtarget" class="com.springaop.service.impl.AopMethodImpl"></bean>
<!--將日志bean和業(yè)務(wù)bean通過代理的方式進(jìn)行代理整合-->
<bean name="aopmethod" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="interceptorNames">
<list>
<value>mylogadvice</value>
<!--此處還可以放置多個(gè)處理方面的bean-->
</list>
</property>
<property name="target" ref="aopmethodtarget"></property>
</bean>
(這里可能大家對代理不是很清楚,我個(gè)人認(rèn)為是把兩個(gè)類或多個(gè)類方法進(jìn)行合并執(zhí)行,
大家通過觀察我們的執(zhí)行結(jié)果可以明白!)
4.測試類
package com.springaop.service.impl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.springaop.service.IAopMethod;
public class test {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
IAopMethod method=(IAopMethod)context.getBean("aopmethod");
method.doSomesing("lisi");
}
}
運(yùn)行結(jié)果是:
系統(tǒng)日志:Fri Sep 24 12:45:24 CST 2010:調(diào)用了doSomesing :使用了參數(shù)[lisi]
hello:lisi
5.大家來想這樣一個(gè)問題我的系統(tǒng)不可能只對一個(gè)類型進(jìn)行日志管理,我可能所有的業(yè)務(wù)類都要進(jìn)行日志管理,那樣的話我要配置多個(gè)bean的代理,這樣的話就非常麻煩了,有沒有簡單一點(diǎn)的方法呢,我們可以采取下面的方式。
<!--處理日志方面的bean-->
<bean name="mylogadvice" class="com.springaop.aop.LogAdvice"></bean>
<!--處理業(yè)務(wù)的bean-->
<bean name="aopmethod" class="com.springaop.service.impl.AopMethodImpl"></bean>
<bean name="aopmethod1" class="com.springaop.service.impl.AopMethod1Impl"></bean>
<!--將日志bean和業(yè)務(wù)bean通過代理的方式進(jìn)行代理整合-->
<bean name="logmanager"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames">
<list>
<value>mylogadvice</value>
</list>
</property>
<property name="beanNames">
<list>
<value>aopmethod</value>
<value>aopmethod1</value>
<!—此處可以放置多個(gè)業(yè)務(wù)bean-->
</list>
</property>
</bean>
以上就是我們采用aop的方式實(shí)現(xiàn)的日志管理,希望對大家有所幫助,本人感覺spring的aop月struts2的攔截器類似,可以對比著學(xué)習(xí)。
Spring Aop實(shí)現(xiàn)聲明式事務(wù)
在系統(tǒng)的業(yè)務(wù)邏輯層中,每個(gè)業(yè)務(wù)會(huì)涉及到多個(gè)數(shù)據(jù)庫的操作,業(yè)務(wù)層其實(shí)是通過數(shù)據(jù)層的多個(gè)方法共同完成一個(gè)業(yè)務(wù),而這些方法要么都執(zhí)行,要么都不執(zhí)行,否則會(huì)造成數(shù)據(jù)的不一致,由此我們要對業(yè)務(wù)層進(jìn)行事務(wù)管理。我們有以下兩種方式實(shí)現(xiàn)對業(yè)務(wù)的事務(wù)控制。
1. 傳統(tǒng)的方式:
每個(gè)業(yè)務(wù)方法都手動(dòng)加上事務(wù)控制的代碼。
2. 采用aop的方式。(事務(wù)處理可以看做是業(yè)務(wù)的一個(gè)方面,我們采用aop的方面對這方面進(jìn)行統(tǒng)一的處理)
下面我們采取zop的方式實(shí)現(xiàn)一個(gè)對業(yè)務(wù)層事務(wù)的統(tǒng)一處理
2.1 修改applicationContext.xml
目的是使其支持<tx> <aop>標(biāo)簽。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
">
2.2 配置聲明式事務(wù)
<!--
spring 提供的對hibernate事務(wù)處理的類型相當(dāng)于我們前面講的logAdive,其實(shí)就是對事務(wù)進(jìn)行統(tǒng)一管理的一個(gè)類
-->
<bean name="trasactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!--
此屬性值被HibernateTransactionManager管理的session工廠,
注意sessionFactory已經(jīng)在上面定義過spring整合hibernate時(shí)講過,
注意事務(wù)管理最終就是管理session,所以這里要這樣配置
--><property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!--
定義以何種方式進(jìn)行事務(wù)處理
-->
<tx:advice id="myadvice" transaction-manager="trasactionManager">
<tx:attributes>
<!--
對add開頭的方法采用必要的事務(wù)處理,出錯(cuò)時(shí)回滾-->
<tx:method name="add*" propagation="REQUIRED" rollback-for="Exception" />
<tx:method name="edit*" propagation="REQUIRED"
rollback-for="Exception" />
<tx:method name="del*" propagation="REQUIRED" rollback-for="Exception" />
<tx:method name="drop*" propagation="REQUIRED"
rollback-for="Exception" />
<tx:method name="register*" propagation="REQUIRED"
rollback-for="Exception" />
<!--
對不合以上規(guī)則的其他方法不做事務(wù)提交或回滾處理,是只讀的,一般是指不涉及到數(shù)據(jù)庫更新的方法-->
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
<aop:config>
<!--
切點(diǎn): 對哪些包下面的接口進(jìn)行事務(wù)管理
第一個(gè)星號代表方法返回值類型任意。
第二個(gè)星號代表包下面的接口或類名任意。
第三個(gè)星號代表包下面的接口或類的方法名任意。
小括號里的兩個(gè)點(diǎn)代表方法參數(shù)任意 。
--><aop:pointcut expression="execution(* com.struts.service.*.*(..))"
id="mycutpoint" /><!--
以何種方式處理知道了,對象進(jìn)行處理知道了,下面就是整合了
--><aop:advisor advice-ref="myadvice" pointcut-ref="mycutpoint" />
</aop:config>
轉(zhuǎn)載于:https://blog.51cto.com/3364566/619808
總結(jié)
以上是生活随笔為你收集整理的Spring Aop 日志管理及配置文件的详细配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有点小烦躁。。
- 下一篇: AjaxControlToolkit H