日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Aop 日志管理及配置文件的详细配置

發(fā)布時(shí)間:2025/4/16 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Aop 日志管理及配置文件的详细配置 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

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.

&lt;!--處理日志方面的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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。