首页 > 代码库 > springboot-3-aop
springboot-3-aop
aop存在的目的是进一步解耦, spring支持aspectJ的注解式切面编程
1), 使用@Aspect声明为一个切面, 并使用@Component加入context中
2), 使用@After, @Before, @Aroud定义advice, 可直接引入 pointcut
代码实现:
1, 引入aspectJ的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.6</version> </dependency>
2, 自定义注解
package com.wenbronk.aop; import org.springframework.stereotype.Component; /** * Created by wenbronk on 2017/5/13. */ @Component public class InterceptAnnotation { @AopAnnotation(value = "注解拦截") public void intercept() { System.out.println("annotation intercepting"); } }
3, 自定义方法拦截
package com.wenbronk.aop; import org.springframework.stereotype.Component; /** * 方法拦截 * Created by wenbronk on 2017/5/13. */ @Component public class IntercepterMethod { public void intercepter() { System.out.println("method intercepter"); } }
4, 编写切点
package com.wenbronk.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import java.lang.reflect.Method; /** * 切面 * Created by wenbronk on 2017/5/13. */ @Aspect @Component public class AopAspect { @Pointcut(value = "@annotation(com.wenbronk.aop.AopAnnotation)") // 切点为注解 public void pointCut() {}; /** * 注解式拦截, 可在@After, @Before, @Aroud中直接引入 @pointCut * @param joinPoint */ @After(value = "pointCut()") public void afterPointCut(JoinPoint joinPoint) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); AopAnnotation annotation = method.getAnnotation(AopAnnotation.class); System.out.println("注解式拦截: " + annotation.value()); } /** * 方法式拦截 * @param joinPoint */ @Before(value = "execution(* com.wenbronk.aop.IntercepterMethod.*(..))") public void beforePointCut(JoinPoint joinPoint) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); System.out.println("方法式拦截: " + method.getName()); } }
5, javaconfig
如果你使用的是springboot方式, 那么需要在启动类上添加 @EnableAspectJAutoProxy 开启AspectJ的支持
package com.wenbronk.aop; import org.springframework.boot.SpringBootConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.EnableAspectJAutoProxy; /** * 配置类, 省却Application.java * Created by wenbronk on 2017/5/13. */ @SpringBootConfiguration @ComponentScan(basePackages = {"com.wenbronk.aop"}) @EnableAspectJAutoProxy // 开启对AspectJ的支持 public class AopConfig { }
6, 测试
package com.wenbronk.aop; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * 测试类 * Created by wenbronk on 2017/5/13. */ public class TestAop { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class); // 注解式拦截 InterceptAnnotation annotation = context.getBean(InterceptAnnotation.class); annotation.intercept(); // 方法拦截 IntercepterMethod method = context.getBean(IntercepterMethod.class); method.intercepter(); context.close(); } }
http://www.cnblogs.com/wenbronk/
springboot-3-aop
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。