spring中的aop事务应用

spring中用aop,只对其中的一个方法有用,比如所说,权限检查,我想对add方法进行权限检查,在add方法之前进行检查,但是我不知道怎么配置
class="org.springframework.orm.hibernate3.HibernateTransactionManager">



<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor"
>
    <property name="transactionManager">
        <ref bean="transactionManager"/>
    </property>
    <property name="transactionAttributes">
        <props>
            <prop key="add*">
            PROPAGATION_REQUIRED,-AccountException
            </prop>
        </props>
    </property>
</bean>

再忘下就不会配置了,有谁能给指点一下啊

[b]问题补充:[/b]
我还想增加日志功能,比如说,可以在add方法之前进行,也可以在add之后进行,用annotation,也可以用下一种方式,
aop:config



/aop:aspect
/aop:config

,我把spring-aop-2.5.xsd导入的时候有错误,我不想用上面的方法,还有更好的方法吗
[b]问题补充:[/b]
我的意思是说,利用动态代理,对service(里面有好多方法)里面的add方法之前增加日志功能,这个代码怎么实现

[code="java"]
import java.lang.reflect.Method;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Logger;

public class LogInterceptor implements MethodInterceptor {
private static Logger log = Logger.getLogger(LogInterceptor.class);
public Object invoke(MethodInvocation invocation) throws Throwable {

    Method m = invocation.getMethod();
    Class c = m.getDeclaringClass();
    StringBuilder sb = new StringBuilder();
    sb.append("类名为");
    sb.append(c.getName());
    sb.append("调用方法名为");
    sb.append(m.getName());


    log.debug(sb.toString()+"--------开始---------");

    Object ret = invocation.proceed();

    log.debug(sb.toString()+"--------结束---------");

    return ret;
}

}

再到配置文件里
增加

<bean id="logInterceptor"
class="LogInterceptor "



//这里配置你要代理的bean的名称
*service



logInterceptor
transactionInterceptor


[/code]

[code="java"]



beCheckAdd




checkAddAdvisor





        </bean>
    </property>
    <property name="mappedNames">
        <list>
            <value>add</value>
        </list>
    </property>
</bean>

[/code]
beCheckAdd: 你在代理哪个bean
xxxx.xxx.xx.CheckInterceptor: check权限的拦截器
mappedNames中的add: 只拦截add方法

你检查权限,只是一个普通的aop拦截,和事务没有多大关系,不需要用到事务拦截



//这里配置你要代理的bean的名称
xxx



transactionInterceptor


你自己的增加日志功能的拦截器,你写好了没有
如果写好了,就配置成一个bean



//这里配置你要代理的bean的名称
xxx



日志功能拦截器的bean名称
transactionInterceptor


记录日志类
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class LogInterceptor implements MethodInterceptor {
private static Logger log = Logger.getLogger(LogInterceptor.class);

public Object invoke(MethodInvocation invocation) throws Throwable {
    StringBuilder sb = new StringBuilder();
    long procTime = System.currentTimeMillis();
    log.log(Level.INFO, sb.toString() + "\n" + "--------开始---------");
    log.log(Level.INFO,invocation.getArguments()[0] + " 开始执行 "
            + invocation.getMethod() + " 方法");
    try {
        Object result = invocation.proceed();
        return result;
    } finally {
        procTime = System.currentTimeMillis() - procTime;
        log.log(Level.INFO,invocation.getArguments()[0] + " 执行 "
                + invocation.getMethod() + " 方法结束");
        log.log(Level.INFO,"执行 " + invocation.getMethod().getName()
                + " 方法共用了 " + procTime + "毫秒");
        log.log(Level.INFO,sb.toString() + "\n" + "--------结束---------");
    }
}

}

Spring配置文件里添加

<bean
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames">
        <value>要代理的service名称</value>
    </property>
    <property name="interceptorNames">
        <list>
            <value>logInterceptor</value>
        </list>
    </property>
</bean>

权限控制最好用Spring Security,例如下面的代码
session-fixation-protection="newSession" access-denied-page="/login.jsp">


default-target-url="/jump.do" authentication-failure-url="/login.jsp?login_error=1"
always-use-default-target="true" />

<beans:bean id="httpSessionContextIntegrationFilter"
    class="org.springframework.security.context.HttpSessionContextIntegrationFilter" />
<authentication-provider>
    <password-encoder hash="sha-256" />
    <user-service>
        <user name="admin"
            password="8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918"
            authorities="ROLE_ADMIN" />
    </user-service>
</authentication-provider>

也可以从数据库读取用户名和密码