Spring AOP

面向切面

编程范式包括面向过程、面向对象、函数式编程、事件驱动编程和面向切面编程。
面向切面(AOP)编程是对面向对象(OOP)的补充,解决某一类特定问题。
面向切面主要要解决的问题是DRY(don’t repeat yourself)和SOC(separation of concerns)关注点分离。
关注点分离既包括横向分离(展示层、服务层、持久层),又包括垂直分离(不同的模块)。面向切面要实现的就是把功能性需求从非功能性需求中分离出来。
权限控制,缓存控制,事务控制,日志监控,异常处理都是AOP可以发挥的地方。
##商品管理员例子
需求为只有管理员可以操作商品。
商品的模型如下所示:

	public class Product {
		private Long id;
		private String name;
		// ...
	}

控制的服务为

	public class ProductService {
		public void insert(Product product) {
			System.out.println("insert success");
		}
		public void delete(Long id) {
			System.out.println("delete success");
		}
	}

权限校验的类为

	public class AuthService {
		public void checkAccess() {
			String user = xx.get();
			if (!"admin".equals(user)) {
				throw new RuntimeException("...");
			}
		}
	}

如果我们将鉴权操作增加到操作商品中间,就会出现这样的硬编码

	public class ProductService {
		@Autowired
		AuthService authService;
		public void insert(Product product) {
			authService.checkAccess();
			System.out.println("insert success");
		}
		public void delete(Long id) {
			authService.checkAccess();
			System.out.println("delete success");
		}
	}

这时可以定义一个切面

	@Aspect
	@Component
	Public class SecurityAspect {
		@Autowired
		AuthService authService;
		// 声明annotation(注解)
		@Pointcut("annotation(AdminOnly)")
		public void adminOnly() {
		}
		@Before("adminOnly()")
		public void check() {
			authService.checkAccess();
		}
	}

这时就可以在服务层通过注解方式来引入,在方法之前进行了拦截

	public class ProductService {
		@AdminOnly
		public void insert(Product product) {
			System.out.println("insert success");
		}
		@AdminOnly
		public void delete(Long id) {
			System.out.println("delete success");
		}
	}

具体使用

Spring AOP可以通过xml方式或者注解方式进行配置(对AOP进行声明)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值