https://www.imooc.com/video/15678
【概念】
是一种编程范式(其他变成范式:面向过程、面向函数)
【目的】
DRY:解决代码重复问题
SOC:关注点分离
【@Aspect】
表示该类是一个切面的配置类
【@pointcut】
表示那些类那些方法上来植入代码,由切面表达式组成
@Pointcut("@annotation(AdminOnly)")
public void adminOnly(){
}
【Advice】
包括@Before,@After等,表示在方法的之前/之后进行代码的植入
格式:@Pointcut("切入点表达式"),方法体通常是空的。
1)匹配包/类型
@Pointcut("within(com.xyg.Service.UserService)")
public void matchType(){}
2)匹配对象
1)@Pointcut("this(com.xyg.DemoDao)")
public void thisDemo(){}//匹配指定类型的方法
2)@Pointcut("target(com.xyg.IDao)")
public void targetDemo(){}//匹配接口
3)@Pointcut("bean(*Service)")
public void BeanDemo(){}//匹配以Service结尾的Bean
3)参数配置
4)注解匹配
5)execution表达式
【例子】
@Aspect
@Component
public class LoggingApsect
{
@Pointcut("execution(* com.sqp.spring.aop.dao.MyCalculator.*(..))")
public void declarePointcutExpression(){};
/**
* 前置通知:
* 在目标方法执行之前执行前置通知(使用execution()指定目标方法)
* /
@Before("declarePointcutExpression()")
public void beforeAdvice(JoinPoint joinPoint)
{
//获取方法名
String methodName = joinPoint.getSignature().getName();
//获取入参
List<Object> args = Arrays.asList(joinPoint.getArgs());
System.out.println("The method [" + methodName + "] input params is " + args);
}
}
如果目标对象实现了接口用JDK动态代理,没有实现接口用cglib进行动态代理,如果实现了
接口且强制cglib代理,则使用cglib代理。
客户端发送请求-> 前端控制器 DispatcherServlet 接受客户端请求 -> 找到处理器映射 HandlerMapping 解析请求对应的 Handler-> HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求,并处理相应的业务逻辑 -> 处理器返回一个模型视图 ModelAndView -> 视图解析器进行解析 -> 返回一个视图对象->前端控制器 DispatcherServlet 渲染数据(Moder)->将得到视图对象返回给用户
原文:https://www.cnblogs.com/xiongyungang/p/10480422.html