Spring AOP学习:AspectJ

本文通过一个具体的例子展示了如何使用AspectJ实现对业务逻辑的增强,包括权限验证及用户交互确认等,同时介绍了自定义切面的具体实现。

一、
package com.spring.aop.test.aspectj.test_2;

import java.util.Date;

/**
 * 管理员
 * @author Administrator
 *
 */
public class Operator {

 private Integer id ;
 private String name ;
 private String password ;
 private Integer popedom ;
 private Date loginTime ;
 ..set()/get().... 
}

二、

package com.spring.aop.test.aspectj.test_2;

import java.util.Date;

/**
 * 新闻类别信息
 * @author Administrator
 *
 */
public class NewsType {

 private Integer id ;
 private String typeName ;
 private String desc ;
 private Operator operator ;
 private Date addTime ;
 
 public NewsType(){}
 ...set()/get()...
}

三、

package com.spring.aop.test.aspectj.test_2;

import java.util.List;

public interface BasicDao<T> {

 boolean save(T t) ;
 boolean delete(T t) ;
 boolean update(T t) ;
 T get(Integer id) ;
 List<T> get() ; 
}

四、

package com.spring.aop.test.aspectj.test_2;

import java.util.List;

public class NewsTypeDaoImpl implements BasicDao<NewsType> {

 public boolean delete(NewsType t) {
  
  System.out.println("=======删除NewsType对象=======");
  return true;
 }

 public NewsType get(Integer id) {

  System.out.println("=======获取一个NewsType对象=======");
  return new NewsType();
 }

 public List<NewsType> get() {
  
  System.out.println("======获取一个NewsType对象列表======");
  return null;
 }

 public boolean save(NewsType t) {
  
  System.out.println("======保存NewsType对象======");
  return true;
 }

 public boolean update(NewsType t) {
  
  System.out.println("======更新NewsType对象======");
  return true;
 }

}


五、

package com.spring.aop.test.aspectj.test_2;

import java.io.*;
import java.util.Date;


public aspect NewsTypeAspect {

 private static java.text.SimpleDateFormat df=new java.text.SimpleDateFormat("yyyy-MM-dd H:m:s");
 
 //定义操作时间切入点
 pointcut operatorTime(): execution(* *.*());
 //定义保存切入点
 pointcut saveNewsType(NewsTypeDaoImpl dao): target(dao)&&execution(boolean NewsTypeDaoImpl.save(NewsType));
 //定义删除切入点
 pointcut deleteNewsType(NewsTypeDaoImpl dao): target(dao)&&execution(boolean NewsTypeDaoImpl.delete(NewsType));
 
 //输出操作开始时间
 before(): operatorTime(){
  
  System.out.println("用户操作开始时间:"+df.format(new Date()));
 }
 //保存时,判断用户是否拥有保存权限
 boolean around(NewsTypeDaoImpl dao): saveNewsType(dao){

  NewsType type = (NewsType)thisJoinPoint.getArgs()[0];
  if(type.getOperator().getPopedom() > 0){
   
   System.out.println("====开始保存NewsType对象====");
   System.out.println("保存时间:"+df.format(new Date()));
   return proceed(dao);
  }else{
   
   System.out.println("你暂时还没有保存NewsType对象的权利");
   System.out.println("你的权限为:"+type.getOperator().getPopedom());
   return false;
  }
 }
 
 //删除时,要提示用户是否真的要删除此对象
 boolean around(NewsTypeDaoImpl dao): deleteNewsType(dao){
  
  boolean flag = false;
  try{
   
   NewsType type = (NewsType)thisJoinPoint.getArgs()[0];
   
   if(type.getOperator().getPopedom() > 0){
    
    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("开始删除操作......");
    System.out.println("Enter a operator<Y/N>:");
    String info = stdin.readLine();
    
    if(info.indexOf("Y") != -1){
     
     System.out.println("可以删除......");
     flag = proceed(dao);
     if(flag){
      
      System.out.println("=======删除Newstype对象成功=======");
     }else{
      
      System.out.println("=======删除NewsType对象失败=======");
     }
    }else{
     
     System.out.println("数据未被删除......");
    }
   }else{
    
    System.out.println("你没有删除NewsType对象的权限......");
   }
  }catch(Exception e){
   
   System.out.println(e.getMessage());
  }
  return flag;
 }
 
}

六、

package com.spring.aop.test.aspectj.test_2;

public class NewsTypeDaoTest {

 public static void main(String[] arg){
  
  Operator op = new Operator();
  op.setId(1);
  op.setName("admin");
  op.setPassword("password");
  op.setPopedom(1);
  
  NewsType type = new NewsType();
  type.setId(1);
  type.setOperator(op);
  type.setTypeName("新闻");
  
  NewsTypeDaoImpl dao = new NewsTypeDaoImpl();
//  if(dao.save(type)){
//   
//   System.out.println("save ok......");
//  }else{
//   
//   System.out.println("save failed......");
//  }
  
  if(dao.delete(type)){
   
   System.out.println("delete NewsType succ......");
  }else{
   
   System.out.println("delete NewsType failed......");
  }
 }
}

采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的三层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式校验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值