C语言是面向过程的,c++是面向对象的
面向过程到面向对象
面向过程
假如下雨了,我打开了雨伞
面向对象
实例一个天气对象,赋予一个下雨的动作
实例一个我,赋予一个打伞的动作
总而言之,二者是换了个角度看世界,换个姿势处理问题
面向对象是将需求功能垂直划分为不同的,相对独立的,封装成良好的类。有自己的函数,AOP技术恰恰相反他利用的是一种的横切的技术,将面向对象的封装的类进行水平的切割。
将通用逻辑从业务逻辑中分离出来
网络请求的生命周期:从客户端收到HttpRequest请求,记录请求,处理请求,生成HttpResponse返回给客户端,返回给客户端之前再次记录
操作数据库的生命周期:收到数据库才做请求,记录请求,增删改查,生成处理结果,记录回复。
假设我们在执行controller里面的方法时要保证执行每一个方法时都必须进行登陆验证,这就很麻烦了,不可能每一个方法都写一个判断语句,我们可以在contrller的构造函数里面写if语句,但是spring在启动的时候就将类给实例化了,当客户端发http请求时,压根就调用不到那个构造方法。我们就必须写一个统一的类
使用aop
1)添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2)新建一个处理文件aspect,在新建一个类
3)类名上面要添加一个@Aspect和@Component注解,将这个类引入到spring 容器里面去
4)我们希望在http请求到controller方法之前就将他记录下来。在要调用的方法前面写@Before("excution(public * com.imooc.comtroller.UserController.getList(..))")
注解里面写要拦截的方法路径及名称,方法里面两个点代表这个方法名的任意参数方法,如果需要拦截所有方法就*(..)
5)请求处理之后要要调用的方法就加@After(”excution(public * com.imooc.comtroller.UserController.getList(..))“)
使用aop处理整合加强版
1)上面@Before,@After里面有重复的代码,我们将@Before改为@Pintcut,函数体删掉,@After("")里面写上@Pintcut的函数名,@Before也是一样的
2)前面的@Before,@After的函数体都是system的打印方式,其实我们可以换一下用spring自带的框架Logger
在aop类里面添加private final static Logger logger=LoggerFactory.getLogger(HttpAspect.class);
将system换位logger.info("111111")
3)获取返回的内容@AfterReturning(returning="object" pointcut="log()")returning是入参参数
package com.example.demo.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* @Author :zhanglu
* @Description:@Component是将文件引入到sprin容器里
* @Date :Created in 17:20 2017/11/6
* @Modified By:
*/
@Aspect
@Component
public class HttpAspect{
private final static Logger logger= LoggerFactory.getLogger(HttpAspect.class);
@Pointcut("execution(public * com.example.demo.controller.UserControler.*(..))")
public void log(){
}
// 方法执行之前就已经执行
@Before("log()")
public void doBefore(JoinPoint joinPoint){
ServletRequestAttributes attributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request=attributes.getRequest();
//url
logger.info("url={}",request.getRequestURL());
//Method
logger.info("method={}",request.getMethod());
//ip
logger.info("method={}",request.getRemoteAddr());
//类方法
logger.info("class_method={}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
//参数
logger.info("args={}",joinPoint.getArgs());
logger.info("1111");
}
//方法执行后
@After("log()")
public void doAfter(){
logger.info("2222");
}
@AfterReturning(returning ="object",pointcut="log()")
public void doAfterReturning(Object object){
logger.info("response={}",object);
}
}