利用aop我们可以实现业务代码与系统级服务例如日志记录、事务及安全相关业务的解耦,使我们的业务代码更加干净整洁。
最近在做数据权限方面的东西,考虑使用切面对用户访问进行拦截,进而确认用户是否对当前数据有访问权限,而我们的项目是springboot项目,所以花时间研究了下springboot下切面的实现。了解springcloud架构可以加求求:三五三六二四七二五九
1、首先加入相关maven依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2、编写控制器
@RestController public class HelloController { @RequestMapping("/add1") public String addData1(String deviceId) { return "success"; } @RequestMapping("/add2") public String addData2(String deviceId) { return "success"; } @RequestMapping("/add3") public String addData3(String deviceId) { return "success"; } }
3、配置切面
@Aspect @Component public class TestAspect { @Pointcut("execution(public * com.example.demo.controller.HelloController.add*(..))") public void addAdvice(){} @Around("addAdvice()") public Object Interceptor(ProceedingJoinPoint pjp){ Object result = null; Object[] args = pjp.getArgs(); if(args != null && args.length >0) { String deviceId = (String) args[0]; if(!"03".equals(deviceId)) { return "no anthorization"; } } try { result =pjp.proceed(); } catch (Throwable e) { e.printStackTrace(); } return result; } }
这样下来我们就实现了一个简单切面,在切面中实现自己的数据安全认证,此处只做一个简单判断,测试如下:
4、但是这样的切面不够灵活,所以我们添加一个自定义注解
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { }
5、修改切面类
@Aspect @Component public class TestAspect { @Pointcut("execution(public * com.example.demo.controller.HelloController.add*(..)) && @annotation(com.example.demo.controller.MyAnnotation)" ) public void addAdvice(){} @Around("addAdvice()") public Object Interceptor(ProceedingJoinPoint pjp){ Object result = null; Object[] args = pjp.getArgs(); if(args != null && args.length >0) { String deviceId = (String) args[0]; if(!"03".equals(deviceId)) { return "no anthorization"; } } try { result =pjp.proceed(); } catch (Throwable e) { e.printStackTrace(); } return result; } }
6、修改控制器,给需要切面的方法上加上注解
@RestController public class HelloController { @MyAnnotation @RequestMapping("/add1") public String addData1(String deviceId) { return "success"; } @RequestMapping("/add2") public String addData2(String deviceId) { return "success"; } @RequestMapping("/add3") public String addData3(String deviceId) { return "success"; } }
通过自定义注解,我们可以灵活的添加切面,在需要使用切面的方法上添加注解,测试如下:
实际开发中我们可以将"execution(public * com.example.demo.controller.HelloController.add*(..)) && @annotation(com.example.demo.controller.MyAnnotation)"改为"execution(public * com.example.demo.controller.*.*(..)) && @annotation(com.example.demo.controller.MyAnnotation)",这样在controller包下,只有我们加上@MyAnnotation注解的方法切面方法才会起作用。
相关推荐
Spring Boot作为Spring框架的一个子项目,旨在简化应用程序的创建和配置过程,而Spring Cloud则提供了全面的服务治理工具,使得在分布式系统中进行服务发现、负载均衡、配置管理和熔断等操作变得更加便捷。...
总结来说,"springboot+springcloud+eureka+ribbon/feign"的组合,为构建高可用、可伸缩的微服务架构提供了强大的支持。通过服务注册与发现、客户端负载均衡,我们可以轻松管理分布式系统中的服务,提高系统的稳定性...
在本项目"springcloud+springboot+feign项目demo"中,主要展示了如何结合Spring Boot、Spring Cloud以及Feign来构建一个微服务架构的应用。这是一个实际操作的示例,涵盖了微服务开发的关键技术和最佳实践。下面将...
Spring Boot简化了创建独立、生产级别的基于Spring的应用程序的过程,而Spring Cloud则为开发者提供了快速构建分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线等)的工具。 三、Eureka概述 ...
通过Spring Cloud,开发者可以方便地实现服务注册与发现、服务间的调用、配置管理、熔断机制等微服务核心功能。 综上所述,Spring Boot以其简化配置、自动化设置和强大的集成能力,成为构建分布式微服务系统的重要...
总结来说,本项目展示了如何在SpringBoot应用中整合Dubbo和Nacos,实现服务的发布与消费,以及利用Nacos进行服务发现和配置管理。开发者可以通过学习这个示例,进一步掌握这三者在实际开发中的应用,提升微服务架构...
Spring Cloud 是一个基于 Spring Boot 的微服务框架,它简化了分布式系统中的一些常见模式的开发,如配置管理、服务发现、断路器、智能路由、微批处理、一次性任务执行等。Spring Cloud 旨在为开发者提供快速构建...
提到的“springboot”和“springcloud”是Java生态中非常重要的两个框架,Spring Boot用于简化Spring应用的初始搭建以及开发过程,而Spring Cloud则为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能...
- chapter9-1-4:[Spring Cloud构建微服务架构(四)分布式配置中心](http://blog.didispace.com/springcloud4/) - chapter9-1-5:[Spring Cloud构建微服务架构(五)服务网关]...
SpringCloud是中国开发者非常熟悉的一个微服务框架,它基于SpringBoot实现了云应用的开发、配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、配置中心等一系列功能,大大简化了分布式系统开发的...
SpringCloud 是一个基于 Spring Boot 实现的云应用开发工具包,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...
SpringCloud是Java开发人员常用来构建微服务架构的工具集,它基于SpringBoot进行快速构建,提供了服务发现、配置管理、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等...
断路器示意图 SpringCloud Netflix实现了断路器库的名字叫Hystrix. 在微服务架构下,通常会有多个层次的服务调用. 下面是微服架构下, 浏览器端通过API访问后台微服务的一个示意图: hystrix 1 一个微服务的超时...
Spring Cloud 提供了一整套服务发现、配置中心、负载均衡、熔断器等功能,帮助快速构建分布式系统。 10. **Docker化**: Spring Boot 应用通常可以很容易地被打包为可执行的JAR,然后部署到Docker容器中,实现应用的...
读者将了解到如何通过@SpringBootApplication注解启动Spring Boot应用,并理解自动配置的工作原理。此外,还会深入探讨Spring Boot的内置服务器Tomcat和Jetty,以及如何进行定制化配置。 接着,书中的内容将转向...
首先,Spring Cloud是基于Spring Boot实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等...
- **springcloud**:Spring Cloud是一组用于构建分布式系统的工具集,它提供了服务发现、配置管理、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等功能。 - **...
- **SpringBoot与SEDA+MicroService+RESTful**:SEDA(Staged Event-Driven Architecture)是一种处理大量并发事件的架构模式,Spring Boot可以用于构建微服务,提供RESTful API。结合两者,可以构建高性能、可扩展...
- 分布式配置:通过Spring Cloud Config实现配置中心。 - 调试与测试:使用@SpringBootTest进行集成测试,利用Spring Boot DevTools进行热部署。 总结:Spring Boot以其强大的自动化配置和便捷的开发流程,大大提高...