当前位置: 首页 > news >正文

做网站还要数据库吗查询网 域名查询

做网站还要数据库吗,查询网 域名查询,做优化很好的网站,做网站可以卖钱吗文章目录 一、日志处理二、事务控制三、参数校验四、自定义注解五、AOP 方法失效问题1. ApplicationContext2. AopContext3. 注入自身 六、附录1. 示例代码 AOP 提供了一种面向切面操作的扩展机制,通常这些操作是与业务无关的,在实际应用中,可…

文章目录

    • 一、日志处理
    • 二、事务控制
    • 三、参数校验
    • 四、自定义注解
    • 五、AOP 方法失效问题
      • 1. ApplicationContext
      • 2. AopContext
      • 3. 注入自身
    • 六、附录
      • 1. 示例代码

AOP 提供了一种面向切面操作的扩展机制,通常这些操作是与业务无关的,在实际应用中,可以实现:日志处理、事务控制、参数校验和自定义注解等功能。

Spring AOP 的原理参阅:《Spring中的AOP和动态代理》

一、日志处理

在调试程序时,如果需要在执行方法前打印方法参数,或者在执行方法后打印方法返回结果,可以使用切面来实现。

@Slf4j
@Aspect
@Component
public class LoggerAspect {@Around("execution(* cn.codeartist.spring.aop.sample.*.*(..))")public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {// 方法执行前日志log.info("Method args: {}", joinPoint.getArgs());Object proceed = joinPoint.proceed();// 方法执行后日志log.info("Method result: {}", proceed);return proceed;}
}

二、事务控制

Spring 提供的声明式事务也是基于 AOP 来实现的,在需要添加事务的方法上面使用 @Transactional 注解。

@Service
public class DemoService {@Transactional(rollbackFor = Exception.class)public void insertBatch() {// 带事务控制的业务操作}
}

三、参数校验

如果需要在方法执行前对方法参数进行校验时,可以使用前置通知来获取切入点方法的参数,然后进行校验。

@Slf4j
@Aspect
@Component
public class ValidatorAspect {@Before("execution(* cn.codeartist.spring.aop.sample.*.*(..))")public void doBefore(JoinPoint joinPoint) {// 方法执行前校验参数Object[] args = joinPoint.getArgs();}
}

四、自定义注解

因为 AOP 可以拦截到切入点方法,Spring 也支持通过注解的方式来定义切点表达式,所以可以通过 AOP 来实现自定义注解的功能。

例如,自定义一个注解来实现声明式缓存,把方法的返回值进行缓存。

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Cacheable {/*** 缓的Key*/String key();/*** 缓存过期时间*/long timeout() default 0L;/*** 缓存过期时间单位(默认:毫秒)*/TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
}

然后定义一个切片来实现常规的缓存操作,先读缓存,缓存不存在时执行方法,然后把方法的返回结果进行缓存。

@Aspect
@Component
public class AnnotationAspect {@Around("@annotation(cacheable)")public Object doAround(ProceedingJoinPoint joinPoint, Cacheable cacheable) throws Throwable {// 自定义缓存逻辑return joinPoint.proceed();}
}

五、AOP 方法失效问题

Spring AOP 的原理是在原有方法外面增加一层代理,所以在当前类调用 AOP 方法时,因为 this 指向的是当前对象,而不是代理对象,所以 AOP 会失效。

@Service
public class DemoService {public void insert() {// 该方法事务会失效insertBatch();}@Transactional(rollbackFor = Exception.class)public void insertBatch() {// 带事务控制的业务操作}
}

解决这个问题的常用方法有下面三种:

1. ApplicationContext

使用 ApplicationContext 来手动获取 Bean 对象,来调用 AOP 方法:

@Service
public class DemoService {@Autowiredprivate ApplicationContext applicationContext;public void insert() {DemoService demoService = applicationContext.getBean(DemoService.class);demoService.insertBatch();}@Transactional(rollbackFor = Exception.class)public void insertBatch() {// 带事务控制的业务操作}
}

2. AopContext

使用 AopContext 工具类来获取当前对象的代理对象。

@Service
public class DemoService {public void insert() {((DemoService) AopContext.currentProxy()).insertBatch();}@Transactional(rollbackFor = Exception.class)public void insertBatch() {// 带事务控制的业务操作}
}

3. 注入自身

使用 Spring 注入自身来调用 AOP 方法:

@Service
public class DemoService {@Autowiredprivate DemoService that;public void insert() {that.insertBatch();}@Transactional(rollbackFor = Exception.class)public void insertBatch() {// 带事务控制的业务操作}
}

六、附录

1. 示例代码

Gitee 仓库:https://gitee.com/code_artist/spring

在这里插入图片描述

http://www.khdw.cn/news/48203.html

相关文章:

  • 做英语翻译兼职的网站郑州今日重大新闻
  • 做网站应该学什么优化关键词的方法
  • 请人做网站买断域名排名网
  • 机械厂做网站到底有没有效果app推广代理
  • 手机怎么做微信公众号网站seo规划
  • 免费劳务网站建设广州疫情已经达峰
  • 网站专题建设合同国内搜索引擎排名第一的是
  • 网站开发都用什么语言seo霸屏
  • 中国建设教育网站行业关键词查询
  • 把两个网站合并到一个网页搭建一个网站平台需要多少钱
  • 深圳微商城网站制作费用zac seo博客
  • 小程序免费开发制作长沙官网seo收费标准
  • 网站制作台州关键词云图
  • 个性化网站建设多少钱企业培训心得体会
  • 合作社做网站有用吗搜索引擎优化的意思
  • 大型网站建设制作平台seo外链推广员
  • 深圳网站建设三把火宁波企业seo外包
  • 买域名做网站跳转阻断艾滋病的药有哪些
  • 温州手机网站制作优化关键词的方法有哪些
  • 做设计一般用的素材网站是什么意思百度快速seo软件
  • 上海人才网最新招聘信息2022年郑州seo服务技术
  • 找人做app网站吗培训总结
  • 做汽车团购的网站建设营销qq下载
  • 网站开发参考书建设网站推广
  • 中国郑州建设信息网站新闻摘抄大全
  • 网站访客qq获取代码百度指数人群画像哪里查询
  • 怎么找人帮做网站推广手段和渠道有哪些
  • 深圳公司网站建设网上怎么找客户资源
  • 淘宝推广网站怎么做百度站长工具app
  • 网站设计案例网站旺道seo工具