AOP的原理和应⽤场景
问题的引出:
传统的OOP程序经常表现出⼀些不⾃然的现象,核⼼业务中总掺杂着⼀些不相关联的特殊业务,如⽇志记录,权限验证,事务控制,性能检测,错误信息检测等等,这些特殊业务可以说和核⼼业务没有根本上的关联⽽且核⼼业务也不关⼼。
这些特殊业务会带来哪些问题呢?
1.代码混乱,⼤量的外围操作可能会混乱核⼼操作的代码,⽽且当外围模块有重⼤修改时也会影响到核⼼模块。
2.代码分散和冗余:同样的功能代码,在其他的模块⼏乎随处可见,导致代码分散并且冗余度⾼。
3.代码质量低扩展难:由于不太相关的业务代码混杂在⼀起,⽆法专注核⼼业务代码,当进⾏类似⽆关业务扩展时⼜会直接涉及到核⼼业务的代码,导致拓展性低。
解决:
假设现在我们把⽇志、权限、事务、性能监测等外围业务看作单独的关注点(也可以理解为单独的模块),每个关注点都可以在需要它们的时刻及时被运⽤⽽且⽆需提前整合到核⼼模块中。将每个关注点与核⼼业务模块分离,作为单独的功能,横切⼏个核⼼业务模块。
这就叫AOP(⾯向切⾯编程)
其中的⼏个应⽤:aop配置
<aop:aspectj-autoproxy />
<beans:bean id="controllerAop"class="xxxmon.aop.ControllerAOP" />
<aop:config>
<aop:aspect id="myAop"ref="controllerAop">
<aop:pointcut id="target"
expression="execution(public xxxmon.beans.ResultBean *(..))" />
<aop:around method="handlerControllerMethod" pointcut-ref="target" />
</aop:aspect>
</aop:config>
ResultBean定义带泛型
@Data
public class ResultBean<T> implements Serializable {
private static final long serialVersionUID = 1L;
public static final int NO_LOGIN = -1;
public static final int SUCCESS = 0;
public static final int FAIL = 1;
public static final int NO_PERMISSION = 2;
private String msg = "success";
private int code = SUCCESS;
private T data;
public ResultBean() {
super();
}
public ResultBean(T data) {
super();
this.data = data;
}
public ResultBean(Throwable e) {
super();
this.msg = e.toString();
}
}
AOP代码打印⽇志,捕获异常,异常区分已知异常和未知异常,包括接⼝执⾏时间
/**
* 处理和包装异常
*/
public class ControllerAOP {
private static final Logger logger = Logger(ControllerAOP.class);
public Object handlerControllerMethod(ProceedingJoinPoint pjp) {
long startTime = System.currentTimeMillis();
ResultBean<?> result;springboot实现aop
try {
result = (ResultBean<?>) pjp.proceed();
logger.Signature() + "use time:" + (System.currentTimeMillis() - startTime));//⽇志去记录接⼝执⾏时间    } catch (Throwable e) {
result = handlerException(pjp, e);
}
return result;
}
/**
* 封装异常信息,注意区分已知异常(⾃⼰抛出的)和未知异常
*/
private ResultBean<?> handlerException(ProceedingJoinPoint pjp, Throwable e) {
ResultBean<?> result = new ResultBean();
// 已知异常
if (e instanceof CheckException) {
result.LocalizedMessage());
result.setCode(ResultBean.FAIL);
} else if (e instanceof UnloginException) {
result.setMsg("Unlogin");
result.setCode(ResultBean.NO_LOGIN);
} else {
<(Signature() + " error ", e);
//TODO 未知的异常,应该格外注意,可以发送邮件通知等
result.String());
result.setCode(ResultBean.FAIL);
}
return result;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。