Spring mvc项目自定义注解实现拦截器和aop实现日志打印

Spring mvc项目自定义注解实现拦截器和aop实现日志打印



一、自定义注解实现拦截器

1.新建注解类

// 登录时做拦截
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginInterceptor {

}

2.新建一个类,实现HandlerInterceptor接口和方法

/**
 *自定义拦截器
 *实现HandlerInterceptor接口
 **/
@Component
public class SourceAccessInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入拦截器了");
        // 反射获取方法上的LoginInterceptor注解
        HandlerMethod handlerMethod = (HandlerMethod)handler;
        LoginInterceptor loginInterceptor = handlerMethod.getMethod().getAnnotation(LoginInterceptor.class);
        if(loginInterceptor == null){
            return true;
        }
        // 有LoginInterceptor注解说明需要登录,提示用户登录
        response.setContentType("application/json; charset=utf-8");
        response.getWriter().print("你访问的资源需要登录再访问");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

3.spring-mvc.xml文件添加拦截器配置

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="cn.tangtj.clouddisk.security.SourceAccessInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

在这里插入图片描述

< bean>中添加的是自定义的拦截器类的目录,spring项目必须要添加xml的配置。

spring-boot项目就可以用@Configuration注解加配置类代替xml配置

例如创建一个类,实现WebMvcConfigurer接口,将自定义拦截器添加到MVC中即可

@Configuration
public class MyConfig implements WebMvcConfigurer {
    public void addInterceptors(InterceptorRegistry registry){
        System.out.println("拦截全部");
        // 使拦截器生效 1.此处参数是我们自定义的拦截器名( SourceAccessInterceptor )
        // 2.添加拦截规则(/**)拦截全部
        registry.addInterceptor(new SourceAccessInterceptor()).addPathPatterns("/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

4.将自定义的注解添加到相应控制器中

二、aop实现日志打印

将核心业务代码和非核心代码分开,非核心代码抽离出来放到代理对象中,然后通过代理对象访问核心业务的方法,既解耦又方便维护非核心代码。

关注点:横切、前置通知、后置通知、返回通知

1.导入切面需要的依赖包

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>

2.新建注解类

@Target(ElementType.METHOD) // 作用于方法
@Retention(RetentionPolicy.RUNTIME)
public @interface LogPrint {
    String module() default "";
}

3.新建切面类

@Aspect // 1.切面类注解
public class MyLogAspect {
    private static Logger logger = LogManager.getLogger(MyLogAspect.class.getName());
    // 2. PointCut表示这是一个切点,@annotation表示这个切点切到一个注解上,后面带该注解的全类名
    // @Pointcut("execution(public * *(..))") execution:匹配指定方法。
    // 切面最主要的就是切点,所有的故事都围绕切点发生
    @Pointcut("execution(* cn.tangtj.clouddisk.web.LoginController.*(..))")
    public void controllerPoint() {

    }

    // 环绕通知
    @Around("controllerPoint()")
    public Object log(JoinPoint joinPoint) {
        System.out.println("进aop了 Around");
        String className = joinPoint.getSignature().getDeclaringType().getSimpleName();
        String methodName = joinPoint.getSignature().getName();
        // 打印到控制台,
        logger.info("请求类:{},请求方法:{}", className, methodName);
        return null;
    }
}

4.开启aop:aspectj-autoproxy的xml配置

<bean id="myLogAspect" class="cn.tangtj.clouddisk.annotation.MyLogAspect"></bean>
    <!--开启注解支持: JDK(默认proxy-target-class="false") 
    cglib库(AOP proxy就是target object被增强后的对象,
    在Spring AOP中是通过JDK动态代理或者CGLIB代理技术实现的。)-->
    <aop:aspectj-autoproxy proxy-target-class="false"></aop:aspectj-autoproxy>

5.将自定义的注解添加到相应控制器中

三、知识点详解

1.自定义注解

在这里插入图片描述

2.AOP

缩写:Aspect-oriented Programming

目的:对具有横切性质的业务逻辑进行集中处理,典型的应用就是Spring中的事务管理功能。

实现理解:
在Spring中,可以用注解@Aspect定义一个类为一个切面,也可以采用XML的形式定义一个类为切面。在切面类中我们需要定义pointcut(切入点),advice(通知)。Spring会在符合pointcut定义的join point(连接点)处应用advice。

3.expression指示符

execution:匹配指定。

execution(public * *(..))	//任意public方法
execution(* set*(..))	//任意名称以set开头的方法
execution(* com.xyz.service.AccountService.*(..))	//com.xyz.service.AccountService接口中定义的任意方法
execution(* com.xyz.service.*.*(..))	//com.xyz.service包中定义的任意方法
execution(* com.xyz.service..*.*(..))	//com.xyz.service包中及其子包中定义的任意方法

@annotation:注解类指定。

// @annotation表示这个切点切到一个注解上,后面带该注解的全类名
@Pointcut("@annotation(me.zebin.demo.annotationdemo.aoplog.MyLog)")
public void logPointCut(){};

其他指定方法参考
https://blog.csdn.net/qq_41231926/article/details/105489593

四、应用场景

在这里插入图片描述


总结

以上就是今天要讲的内容,本文仅仅简单介绍了Spring mvc项目自定义注解实现拦截器和aop实现日志打印,有描述错误的地方请指出,感谢观看。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC 是一种基于Spring框架的Web开发框架,它是基于模型-视图-控制器(MVC)设计模式来组织和管理Web应用程序的开发的。数据库事务是保证数据操作的一致性和可靠性的重要机制。 在Spring MVC中,数据库事务的实现主要依赖于Spring框架内置的事务管理器。Spring框架为我们提供了多种事务管理器的实现方式,例如基于JDBC的DataSourceTransactionManager和基于JPA的JpaTransactionManager等。这些事务管理器实现Spring的PlatformTransactionManager接口,它负责管理和控制事务的生命周期。 Spring MVC中使用注解@Transactional来标注需要参与事务管理的方法或类。被@Transactional标注的方法或类,会在运行时被Spring框架内置的AOP机制拦截,以实现事务的控制。当方法被调用时,Spring框架首先会检查当前线程是否已经有一个事务实例存在,如果不存在则创建一个新的事务,如果存在则加入已存在的事务中。 一旦事务创建成功,Spring框架会开始执行方法体中的业务逻辑操作。如果方法执行成功,事务将会继续提交,操作的结果将会永久保存到数据库中。如果方法执行失败或发生异常,Spring框架会回滚事务,将操作的结果恢复到之前的状态。这样可以确保在出现异常情况时,数据库的数据不会被污染或损坏。 事务的提交和回滚是由Spring框架的事务管理器来完成的。事务管理器负责管理事务的开始、提交和回滚等操作,并与底层的数据库连接进行交互。Spring框架还提供了各种配置选项,可以通过配置文件或注解来灵活地控制事务的传播行为、隔离级别、超时设置等。这些配置选项可以根据实际业务需求进行调整,以提供更好的性能和可靠性。 总而言之,Spring MVC中的数据库事务的实现原理是依赖于Spring框架提供的事务管理器和AOP机制。通过使用@Transactional注解,我们可以简单地将需要参与事务管理的方法或类进行标注,使其具备事务性的功能。这样可以实现对数据库操作的一致性和可靠性保证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值