转载的。。原文地址
http://blog.csdn.net/xzf19901108/article/details/7835558
注解方式
*******************
beans.xml
*******************
- <?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:context="http://www.springframework.org/schema/context"
- 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/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- ">
- <aop:aspectj-autoproxy/>
- <bean id="myInterceptor" class="blog.service.MyInterceptor"/>
- <bean id="personService" class="blog.service.impl.PersonServiceBean"></bean>
- </beans>
***************
MyInterceptor.java
***************
- package blog.service;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.After;
- import org.aspectj.lang.annotation.AfterReturning;
- import org.aspectj.lang.annotation.AfterThrowing;
- import org.aspectj.lang.annotation.Around;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.aspectj.lang.annotation.Pointcut;
- /**
- * 切面
- *
- */
- @Aspect
- public class MyInterceptor {
- @Pointcut("execution (* blog.service.impl.PersonServiceBean.*(..))")
- public void anyMethod() {
- //表达式解释:* blog.service.impl.PersonServiceBean.*(..):第一个*号表示返回类型;
- //blog.service.impl.PersonServiceBean.*:表示PersonServiceBean类下的所有方法
- //blog.service.impl..*.*:表示blog.service.impl包及其子包下的所有类的所有方法
- //(..):表示所有的参数类型几个数都不限
- }// 声明一个切入点
- //会拦截参数签名位 (String , int)或(String , Integer )类型的方法,
- //参数顺序与args(uname,id)一致,参数类型由(int id,String uname)决定
- @Before("anyMethod() && args(uname,id)")
- public void doAccessCheck(int id,String uname) {
- System.out.println("前置通知:" + uname + id);
- }
- @AfterReturning(pointcut="anyMethod()",returning="result")
- public void doAfterReturning(String result) {
- System.out.println("后置通知:" + result);
- }
- @After("anyMethod()")
- public void doAfter() {
- System.out.println("最终通知");
- }
- @AfterThrowing(pointcut="anyMethod()",throwing="e")
- public void doAfterThrowing(Exception e) {
- System.out.println("例外通知:" + e.getMessage());
- }
- @Around("anyMethod()")
- public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
- //if(){//判断用户是否有权限
- System.out.println("进入方法");
- Object result = pjp.proceed();
- System.out.println("退出方法");
- //}
- return result;
- }
- }
***************
PersonService.java
***************
- package blog.service;
- public interface PersonService {
- public String save(String name);
- public String update(String name,Integer userId);
- public String delete(int id,String dept);
- }
***************
PersonServiceBean.java
***************
- package blog.service.impl;
- import blog.service.PersonService;
- public class PersonServiceBean implements PersonService {
- private String username = null;
- public String getUsername() {
- return username;
- }
- public PersonServiceBean() {
- }
- public PersonServiceBean(String username) {
- this.username = username;
- }
- @Override
- public String save(String name) {
- if (name.equals("") || name == null) {
- throw new RuntimeException("出错啦");
- }
- System.out.println("in save method!" + name);
- return "in save method!" + name;
- }
- @Override
- public String update(String name, Integer userId) {
- System.out.println("in update method! name = " + name + " id = "
- + userId + " username = " + username);
- return "in update method!name = " + name + " id = " + userId;
- }
- @Override
- public String delete(int id, String dept) {
- System.out.println("id = " + id + " dept = " + dept);
- return "in delete method! + nameid = " + id + " dept = " + dept;
- }
- }
***************
SpringAOPTest.java
***************
- package junitTest;
- import org.junit.BeforeClass;
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import blog.service.PersonService;
- public class SpringAOPTest {
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- }
- @Test
- public void AopTest(){
- ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
- PersonService service = (PersonService)ctx.getBean("personService");
- try {
- service.delete(12, "it");
- service.update("发多个地方",324);
- service.save("");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
***************
运行结果
***************
基于xml配置方式
*************
beans.xml
************
- <?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:context="http://www.springframework.org/schema/context"
- 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/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- ">
- <aop:aspectj-autoproxy/>
- <bean id="myInterceptor" class="blog.service.MyInterceptor"/>
- <bean id="personService" class="blog.service.impl.PersonServiceBean"></bean>
- <aop:config>
- <aop:aspect id="aspectBean" ref="myInterceptor" >
- <aop:pointcut id="point" expression="execution (!void blog.service.impl.PersonServiceBean.*(..))"/>
- <aop:before method="doAccessCheck" pointcut-ref="point" />
- <aop:after-returning method="doAfterReturning" pointcut-ref="point" />
- <aop:after-throwing method="doAfterThrowing" pointcut-ref="point"/>
- <aop:after method="doAfter" pointcut-ref="point"/>
- <aop:around method="doBasicProfiling" pointcut-ref="point" />
- </aop:aspect>
- </aop:config>
- </beans>
*******************
MyInterceptor.java
*******************
- package blog.service;
- import org.aspectj.lang.ProceedingJoinPoint;
- public class MyInterceptor {
- public void anyMethod() {
- }
- public void doAccessCheck() {
- System.out.println("前置通知" );
- }
- public void doAfterReturning() {
- System.out.println("后置通知");
- }
- public void doAfter() {
- System.out.println("最终通知");
- }
- public void doAfterThrowing() {
- System.out.println("例外通知");
- }
- public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
- //if(){//判断用户是否有权限
- System.out.println("进入方法");
- Object result = pjp.proceed();
- System.out.println("退出方法");
- //}
- return result;
- }
- }
aop表达式的使用方法
<aop:pointcut id="point" expression="execution (!void blog.service.impl.PersonServiceBean.*(..))"/>
!void blog.service.impl.PersonServiceBean.*(..)中!void 表示拦截所有返回类型为非void类型的方法
java.lang.String表示拦截所有返回类型为String类型的方法
* blog.service.impl.PersonServiceBean.*(java.lang.String,..)表示拦截所有第一个参数为String类型的方法