拦截的原理参考瑾华同学文章:
场景:让一个事务内的调用的第一个方法正常执行,第二个方法抛出异常, 数据都进行回滚,数据库里面没有数据
public interface UserManager {
public void addUser(String username, String password);
public void deleteUser(int id);
public void modifyUser(int id, String username, String password);
public String findUserById(int id);
}
public class UserManagerImpl implements UserManager {
public void addUser(String username, String password) {
System.out.println("-------UserManagerImpl.addUser()----------");
}
public void deleteUser(int id) {
System.out.println("-------UserManagerImpl.deleteUser()----------");
}
public String findUserById(int id) {
System.out.println("-------UserManagerImpl.findUserById()----------");
return null;
}
public void modifyUser(int id, String username, String password) {
System.out.println("-------UserManagerImpl.modifyUser()----------");
}
}
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
/**
* 定义Aspect
* @author Administrator
*
*/
@Aspect
public class SecurityHandler {
/**
* 定义Pointcut,Pointcut的名称就是allAddMethod,此方法不能有返回值和参数,该方法只是一个
* 标识
*
* Pointcut的内容是一个表达式,描述那些对象的那些方法(订阅Joinpoint)
*/
@Pointcut("execution(* add*(..))")
private void allAddMethod(){};
@Pointcut("execution(* del*(..))")
private void allAddMethod1(){};
/**
* 定义Advice,标识在那个切入点何处织入此方法
*/
@Before("allAddMethod()")
private void checkSecurity() {
System.out.println("----------add()---------------");
}
@Before("allAddMethod1()")
private void checkSecurity1() {
Integer.parseInt("abc");
System.out.println("----------delete()---------------");
}
}
- @Aspect
- public class SecurityHandler {
- /**
- * 定义Pointcut,Pointcut的名称就是allAddMethod,此方法不能有返回值和参数,该方法只是一个 标识
- *
- * Pointcut的内容是一个表达式,描述那些对象的那些方法(订阅Joinpoint)
- */
- /*@Pointcut("execution(* add*(..))")
- private void allAddMethod() {
- };
- @Pointcut("execution(* del*(..))")
- private void allAddMethod1() {
- };*/
- /**
- * 定义Advice,标识在那个切入点何处织入此方法
- */
- //@Before("allAddMethod()")
- @Before("execution(* com.alibaba.normandy.service.UserManager.add*(..))")
- private void checkSecurity() {
- System.out.println("----------add()---------------");
- }
- //@Before("allAddMethod1()")
- @Before("execution(* del*(..))")
- private void checkSecurity1() {
- System.out.println("----------delete()---------------");
- Integer.parseInt("abc");
- }
- }
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<aop:aspectj-autoproxy/>
<bean id="securityHandler" class="com.alibaba.spring.SecurityHandler"/>
<bean id="userManager" class="com.alibaba.spring.UserManagerImpl"/>
</beans>
<groupId>com.alibaba.external</groupId>
<artifactId>test.junit</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.external</groupId>
<artifactId>sourceforge.spring.modules.aop</artifactId>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>com.alibaba.external</groupId>
<artifactId>sourceforge.spring.modules.aspects</artifactId>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>com.alibaba.external</groupId>
<artifactId>sourceforge.spring.modules.core</artifactId>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>com.alibaba.external</groupId>
<artifactId>sourceforge.spring.modules.context</artifactId>
<version>2.5.6</version>
</dependency>
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Client {
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
UserManager userManager = (UserManager)factory.getBean("userManager");
userManager.addUser("张三", "123");
userManager.deleteUser(1);
}
}
-------UserManagerImpl.addUser()----------
Exception in thread "main" java.lang.NumberFormatException: For input string: "abc"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:447)
at java.lang.Integer.parseInt(Integer.java:497)
@AfterThrowing
注解来声明。http://ajava.org/online/spring2.5/html/aop-api.html#aop-api-pointcuts-aspectj
- @Around("com.xyz.myapp.SystemArchitecture.businessService()")
- public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
- // start stopwatch
- Object retVal = pjp.proceed();
- // stop stopwatch
- return retVal;
- }