面前切面编程,我的理解就是:我们采取一个方法同时控制多个业务,这些业务可以在不同的方法和类里面。
下面举例:
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