spring boot实战:面向切面编程AOP

本文介绍了一种名为切面编程的编程范式,通过创建切面类来统一控制多个业务的日志信息,实现在不同方法和类中应用相同的功能,如日志记录。文章详细展示了如何在Spring框架下实现切面,包括创建切面类、定义前置和后置通知,以及如何应用到特定的Controller类上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面前切面编程,我的理解就是:我们采取一个方法同时控制多个业务,这些业务可以在不同的方法和类里面。

下面举例:

1.首先添加一个SettingController类,并添加一个setting页面,测试该类

package com.nowcoder.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class SettingController {
    @RequestMapping("/setting")
    @ResponseBody
    public String setting(){
        return "Setting:OK";
    }
}

2.在IndexController类里面测试log日志:

//初始化成员变量logger,返回该类
    private static final Logger logger = LoggerFactory.getLogger(IndexController.class);

    @RequestMapping("/")
    @ResponseBody
    public String index(HttpSession session){
    //日志信息
        logger.info("Visit Index");
        //在首页中显示重定向中的session
        return "Hello World!" + session.getAttribute("msg");
    }

结果:

在访问首页的时候,后台出现日志信息:

2018-08-23 16:39:31.335  INFO 6876 --- [nio-8080-exec-1] com.nowcoder.controller.IndexController  : Visit Index

3.创建一个切面类,控制多个业务日志信息

@Aspect  //首先声明是一个切面
@Component  //添加声明,防止漏掉初始化
public class LogAspect {
    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(LogAspect.class);

    //声明为before
    @Before("execution(* com.nowcoder.controller.IndexController.*(..))")
    public void beforMethod(Joinpoint joinpoint){
        logger.info("before method");
    }
    //声明为after
    //第一个星代表返回信息,第二部分代表类的方法
    @After("execution(* com.nowcoder.controller.IndexController.*(..))")
    public void afterMethod(Joinpoint joinpoint){
        logger.info("after method");
    }
}

再次访问首页面,返回的日志信息为:

2018-08-23 16:54:02.248  INFO 7388 --- [nio-8080-exec-1] com.nowcoder.aspect.LogAspect            : before method
2018-08-23 16:54:02.252  INFO 7388 --- [nio-8080-exec-1] com.nowcoder.controller.IndexController  : Visit Index
2018-08-23 16:54:02.253  INFO 7388 --- [nio-8080-exec-1] com.nowcoder.aspect.LogAspect            : after method

4.控制多个类:

@Aspect  //首先声明是一个切面
@Component  //添加声明,防止漏掉初始化
public class LogAspect {
    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(LogAspect.class);

    //声明为before
    //类名改为*Controller,表示对所有后缀为Controller的类都适用
    @Before("execution(* com.nowcoder.controller.*Controller.*(..))")
    public void beforMethod(JoinPoint joinpoint){
        logger.info("before method");
    }
    //声明为after
    //第一个星代表返回信息,第二部分代表类的方法
    @After("execution(* com.nowcoder.controller.*Controller.*(..))")
    public void afterMethod(JoinPoint joinpoint){
        logger.info("after method");
    }

在访问setting页面的时候,就会返回日志:

2018-08-23 17:01:15.694  INFO 2376 --- [nio-8080-exec-1] com.nowcoder.aspect.LogAspect            : before method
2018-08-23 17:01:15.697  INFO 2376 --- [nio-8080-exec-1] com.nowcoder.aspect.LogAspect            : after method

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值