aop-注解方式

来源:互联网 发布:彩虹无人机 知乎 编辑:程序博客网 时间:2024/06/08 16:27

直接 demo

1.接口

package com.bird.service;public interface PersonServer {    public void save(String name);    public void update(String name, Integer id);    public String getPersonName(Integer id);}

2.实现类

package com.bird.service.impl;import com.bird.service.PersonServer;public class PersonServiceBean implements PersonServer{@Overridepublic void save(String name) {System.out.println("我是save方法");}@Overridepublic void update(String name, Integer id) {System.out.println("我是update()方法");}@Overridepublic String getPersonName(Integer id) {System.out.println("我是getPersonName()方法");return "xxx";}}
3.切点

package com.bird.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;/** * 切面 */@Aspectpublic class MyInterceptor {    @Pointcut("execution(* com.bird.service.impl.PersonServiceBean.*(..))")    private void anyMethod() {    }// 定义一个切入点    @Before("anyMethod() && args(name,id)")    public void doAccessCheck(String name, Integer id) {        System.out.println(name + "," + id);        System.out.println("前置通知");    }    @AfterReturning("anyMethod()")    public void doAfter() {        System.out.println("后置通知");    }    @After("anyMethod()")    public void after() {        System.out.println("最终通知");    }    @AfterThrowing("anyMethod()")    public void doAfterThrow() {        System.out.println("例外通知");    }    @Around("anyMethod()")    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {        System.out.println("进入环绕通知");        Object object = pjp.proceed();// 执行该方法        System.out.println("退出方法");        return object;    }}
4.spring 配置 bean

<?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: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/aop        http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"><aop:aspectj-autoproxy /><bean id="personServiceBean" class="com.bird.service.impl.PersonServiceBean" /><bean id="myInterceptor" class="com.bird.service.MyInterceptor" /></beans>
5.junit 测试

package junit.test;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.bird.service.PersonServer;public class SpringAOPTest {    @Test    public void inteceptorTest() {        ApplicationContext ctx = new ClassPathXmlApplicationContext("beanAop.xml");        PersonServer bean = (PersonServer) ctx.getBean("personServiceBean");        bean.update("gaoming", 1);    }}
6.结果

进入环绕通知gaoming,1前置通知我是update()方法退出方法最终通知后置通知



0 0
原创粉丝点击