AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。
看一个简单的例子:
定义一个简单的切面CommonAspect
/**
* AOP拦截类,主要定义拦截点,切面拦截可以使用多个拦截点。
*/
@Component
@Aspect
public class CommonAspect {
/**
* 切入点。
*/
@Pointcut("within(com.wjy.crm.common..*)")
public void commonPackage() {
}
/**
* 使用环绕通知对用户操作做简单的权限检查
* @param joinPoint
* @return
*/
@Around("commonPackage()")
public Object userCheck(ProceedingJoinPoint joinPoint) {
return securityCheckUtil.userCheck(joinPoint);
}
private SecurityCheckUtil securityCheckUtil;
public SecurityCheckUtil getSecurityCheckUtil() {
return securityCheckUtil;
}
public void setSecurityCheckUtil(SecurityCheckUtil securityCheckUtil) {
this.securityCheckUtil = securityCheckUtil;
}
}
----------切面拦截的具体实现类
@Component("securityCheckUtil")
public class SecurityCheckUtil {
private static final Logger log = Logger.getLogger(SecurityCheckUtil.class);
/**
* Check 是否是系统用户.
*/
public Object userCheck(ProceedingJoinPoint joinPoint) {
return checkUser(joinPoint,2,"此用户不是系统用户!");
}
/**
* 得到返回对象.
*/
@SuppressWarnings("unchecked")
private Object getReturnObject(ProceedingJoinPoint joinPoint) {
Object result = null;
try {
MethodInvocationProceedingJoinPoint point = (MethodInvocationProceedingJoinPoint)joinPoint;
MethodSignature signature = (MethodSignature)point.getSignature();
Class c = signature.getReturnType();
result = c.newInstance();
} catch (Exception e) {
return null;
}
return result;
}
/**
* 设置返回对象的属性值
*/
private Object initObject(Object bean,String message) {
try {
BeanUtils.setProperty(bean, "success", false);
BeanUtils.setProperty(bean, "info", message);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return bean;
}
/**
* 获得用户对象
*/
private User getUser(ProceedingJoinPoint joinPoint) {
HeclaUser user = null;
Object[] args = joinPoint.getArgs();
for(Object obj:args) {
if(obj instanceof User) {
user = (User)obj;
break;
}
}
return user;
}
/**
* 进行用户简单权限检查
*/
private Object checkUser(ProceedingJoinPoint joinPoint,int userType,String message) {
log.debug(String.format("开始拦截%s方法,检查用户是否冻结或者注销!", joinPoint.getSignature()));
Object result = null;
User user = getUser(joinPoint);
Object resultVoid = getReturnObject(joinPoint);
log.error(String.format("开始检查用户权限:%s", user==null?"":user.getNickName()));
try {
if(null != user) {
if(null == user){
return initObject(resultVoid,"此用户不存在!");
}
if(null == user.getChannelType() || user.getChannelId() == null){
return initObject(resultVoid,"此用户已被注销!");
}
if(user.getChannelType() == userType){
return initObject(resultVoid,message);
}
if(user.getChannelType() == 2 && user.getPointId() == null){
return initObject(resultVoid,"此用户已被注销!");
}
}
result = joinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
log.error(String.format("检查用户权限:%s结束", user == null ? null : user.getNickName()));
return result;
}
}
----------下面是AOP的一些基本概念知识
切面(Aspect):对横切关注点的抽象,这个关注点可能会横切多个对象, 上面简单例子的CommonAspect就是一个切面,可以由@Aspect注解定义一个bean对象为切面对象。
连接点(JoinPoint):被拦截到的点,程序执行过程中的某一方法,例子里面com.wjy.crm.common包下面的所有方法
切入点(Pointcut):对哪些连接点进行拦截的定义例子用@Pointcut("within(com.wjy.crm.common..*)")来定义切入点。
通知(Advice):在特定的连接点,AOP框架执行的动作.包括前置通知(在JoinPoint之前执行的通知)、后置通知(JoinPoint退出的时候执行的通知)、例外通知(方法抛出异常退出是的通知)、最终通知(JoinPoint正常完成后执行的通知)和环绕通知(环绕通知在一个方法执行之前和之后执行。它使得通知有机会既在一个方法执行之前又在执行之后运行)。本例用的是环绕通知
引入(Introduction):添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。
目标对象(Target Object):被一个或者多个切面所通知的对象。
AOP代理(AOP Proxy):AOP框架创建的对象,在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。
织入(Weaving):组装方面来创建一个被通知对象。这可以在编译时 完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样, 在运行时完成织入。
相关推荐
一个简单的采用自定义注解结合SpringAop实现方法执行的权限管理,这个demo中并没有涉及到与数据库的交互和业务代码,用户权限在登陆时采用简单的手动初始化。该demo用的jdk1.7编译,Spring4.0版本,只想通过这个demo...
代码实现简单,易于维护:使用 Spring AOP 可以将耗时监测的逻辑与业务逻辑进行解耦,避免业务逻辑代码的冗余和代码维护难度的提高。 2. 安全性高:使用 Spring AOP 进行方法耗时监测,可以在不修改业务逻辑代码的...
基于springsecurity+springmvc+spring+hibernate的权限管理系统,实现资源、用户、权限、角色的增删改查,角色-资源管理,用户-角色管理等基础功能,可以作为springmvc+spring+hibernate的增删改查入门项目,也可以...
日志表:使用aop拦截实现 权限控制:基于token方式,禁用session 对各种不同异常进行了全局统一处理 使用lombok简化java代码,让源码更简洁,可读性高 mybatis未进行二次封装,原滋原味,简单sql采用注解,复杂...
基于SSM(Spring+SpringMVC+MyBatis)的简单电商管理系统是一个功能完善的项目,旨在帮助企业实现电子商务的核心管理功能。随着电子商务行业的迅速发展,企业需要一个高效、可靠的管理系统来处理商品管理、订单处理...
(简单实现) ## 六、系统设计 ### 架构图 ![架构图](/project-docs/images/架构图.png) ### 功能模块图 ![功能模块图](/project-docs/images/功能模块图.png) ### 数据库ER图 1. 用户、物品、类别、物品ER图 !...
POJO)实现一个简单的 Http Server。由于项目时间的不足和当时对 Java 语言的不熟悉,最终写出了一个功能十分单一且简陋的 Server,而且充斥着各种 Bad Smelling 的代码。但是该项目也不是完全没有收获,在一次又一...
采用的是maven管理工程 项目架构是 springmvc4.2.4.RELEASE+spring4.2.4.RELEASE+shiro1.22+hibernate5.1.0.Final 前端框架采用的是bootstrap 实现了角色+权限+用户的控制,另外为了能够更好的查看效果我加了一个实体...
实现用户,权限管理;基于aop,注解,精确到按钮的权限控制.动态表单功能,可在前端设计表单,动态生成数据库表,提供统一的增删改查接口.在线代码生成器,可自定义模板.动态多数据源,支持数据源热加载,热切换,支持分布式...
本资料包是一个基于JSP的内容管理系统,采用了Hibernate3、Struts2和Spring2这三个流行的Java框架...整个系统包括了用户管理、内容管理、权限管理等多个模块,涵盖了内容管理系统的基本功能。用户可以通过浏览器访问
- 新增aop注解实现操作日志功能。 - 支持动态权限修改,采用RBAC模型,前端菜单和后台权限实时更新。 - 后台管理支持修改背景图片,博客配置等信息,操作简单,支持上传相册。 - 代码支持多种搜索模式(Elastic...
JiveJdon也展示了一个基于AOP的通用权限实现案例。 JiveJdon组件架构设计如下: 优异性能 JiveJdon基于对象缓存设计原理,大大提升运行速度,并具有良好的可伸缩性,可借助开源云计算内存技术Terracotta(兵马俑 ...
2、权限管理里实现的功能:按钮管理、菜单管理、角色管理、用户管理、数据字典、单号管理、日志管理等。3、系统用到缓存技术,MemCached和Redis这2种。 01 Reference DLL 这里主要包括第三方的框架和组件项目,把...
自定义通用System.Web.UI.IHierarchicalDataSource简单实现 在 ASP.NET 2.0 中创建 Web 应用程序主题 ASP.NET 2.0 中的数据访问 ASP.NET 2.0:弃用 DataGrid 吧,有新的网格控件了! 将 ASP.NET 2.0 应用程序服务...
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入...
2、权限管理里实现的功能:按钮管理、菜单管理、角色管理、用户管理、数据字典、单号管理、日志管理等。通用于后台管理系统以及权限管理模块。 3、系统用到缓存技术,MemCached和Redis这2种,具体缓存资料网上很多...
数据库使用的是mysql+Mongodb,mysql主要用来存储用户的数据和后台系统的数据,Mongodb主要用来存储Aop的日志记录,Easyui+ajax+jquey主要实现用户在前台查看旅游信息,实现对订单的订购,查看和退单,以及对热点旅游...
BPMX3是企业管理业务的创新关键,可以帮忙用户更科学、更有效管理企业业务的各个环节,企业通过BPMX3可以明显实现业务的高效运营。同时,由于其架构的开放性,采用业界开放性的技术及流程标准,使其能够成为企业SOA...
快速web架构是一套WebUI框架,你不用了解太多的JS,HTML,CSS,AJAX解决方案等技术,只需要编写XML配置文件定义用户界面和通过实现简单的接口来整合客户的商业逻辑,便能实现高效的 AJAX的web应用程序。它能将开发人员...