背景
当经纪人创建客户时,需要给对应的经纪人增加战报信息。在代码层面上,客源的相关类只针对客源数据表操作。而战报信息包含了多种业务统计数据,客源只是其中统计的部分数据。鉴于两者相对独立,且客源的战报信息会有所修改,因此,采用AOP +观察者模式构建代码。
代码
<强>定义一个注解,用于AOP拦截。强>
<代码>/* * *战报注解 */@Retention (RetentionPolicy.RUNTIME) @Target({应用。方法,ElementType.PARAMETER}) @Documented 公共@ interface AchievementAnnotation { OperateEnum操作()默认OperateEnum.ADD; enum OperateEnum { 添加、更新、删除 } } 代码> >之前<强>定义AOP,用户获取数据,并转发给观察者强>
<代码>/* * *战报AOP */@Aspect @ component 公开课AchievementAop {/* * *战报观察者列表 */私人ListobserverList; 公共AchievementAop () { 这一点。,observerList=new ArrayList<的在(); } 公共List getObserverList () { 返回observerList; } 公共空间setObserverList (List observerList) { 如果(零!=this.observerList) this.observerList.addAll (observerList); 这一点。observerList=observerList; }/* * *注入客源的观察者 */@ autowired 公共空间setCustomerAchievementObserver (CustomerAchievementObserver CustomerAchievementObserver) { getObserverList阀门()(customerAchievementObserver); } @Pointcut (“@annotation (com.pretang.cloud.aop.AchievementAnnotation)”) 私人空间切入点(){ } @AfterReturning(切入点="切入点()",返回=" retVal”) 公共无效后(连接点的连接点,对象retVal) { 签名签名=joinPoint.getSignature (); MethodSignature MethodSignature=(MethodSignature)签名; 方法targetMethod=methodSignature.getMethod (); AchievementAnnotation注释=targetMethod.getAnnotation (AchievementAnnotation.class); AchievementAnnotation。OperateEnum OperateEnum=annotation.operate (); (AchievementObserver观察者:observerList) { 如果(observer.isSupport (retVal)) observer.execute (retVal); } } }代码> <强>定义观察者通用接口强>
<代码>/* * *战报信息观察者接口 * @param & lt; T> */公共接口AchievementObserver{/* * *是否支持该对象 * @param obj * @return */布尔isSupport(对象obj);/* * *操作业务数据 * @param t * @throws RuntimeException */执行(T T)抛出RuntimeException的空白; } 代码> >之前 客源观察者
<代码>/* * *客源信息的观察者 */@ component 公共类CustomerAchievementObserver实现AchievementObserver{ @ autowired 私人CustomerRpcService CustomerRpcService; @Override 公共布尔isSupport(对象obj) { 返回obj instanceof CustomerBase; } @Override 公共空间执行(CustomerBase CustomerBase)抛出RuntimeException {//实际业务处理 customerRpcService.saveAchievement (customerBase.getAgentUserId ()、“ADD_CUSTOMER”customerBase.getId ()); } }代码> 观察者模式+ AOP代码示例