简单聊一下自定义的SpringBoot排除器

1.什么是SpringBoot?

这里简单说一下,大家都应该都用过SSM,也就是Spring,SpringMVC,Mybatis,那整合这三个就是大家所熟悉的SSM,所以里面会有很多的配置文件,Spring的配置文件----Spring.xml(名字不固定),mybatis的配置文件,SpringMVC的配置文件,相信大家已经配到快奔溃了(我也是这么过来的)。

但是其实说白了SSM就是几个熟悉的层,dao层,mapper层,service层,controller层,SpringBoot就非常好,这个框架会有一个默认的配置文件,applicatio.yml,里面配置基本的端口号,还有你自己的数据库信息,然后就可以了,是的,没有那么多配置文件,多了什么?多了一些依赖包而已,这些包都是以spring-boot-starter开头,你只要在创建SpringBoot框架时勾选添加或者引入即可。

那这些又是嘛嘞?

这个时候就得来讲讲SpringBoot的一个特点,约定大于配置,很多配置内容它帮我们配好了,这种就叫做自动配置。

2.略显粗糙的源码分析

这个是启动类的代码

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

我们ctrl+鼠标点击这个@SpringBootApplication,进去里面的内容

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {    
        ……
}
@Target({ElementType.TYPE}) :元注解,标注这个注解只能在类上使用
@Retention(RetentionPolicy.RUNTIME):元注解,标注这个注解在运行时解析,它的生命周期是RUNTIME
@Documented:元注解,表明这个注解应该被javadoc工具记录
@Inherited:元注解,表明子类会自动继承该注解

我们ctrl+鼠标点击这个@EnableAutoConfiguration,进去里面的内容

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

我们ctrl+鼠标点击这个AutoConfigurationImportSelecto,进去里面的内容

其实我们可以看到一个大概的苗头了,它的提示信息说,没有找到META-INF/spring的class下面找到文件,那看一下怎么判断的,是一个loadFactoryNames()方法,再点进去

这大概的意思就是启动时会去看一下这个spring.factories文件。

看这个文件干嘛呢?

因为自动配置类是SpringBoot规定的加载规则,默认规则为加载每个jar包下的/META-INF/spring.factories文件中的org.springframework.boot.autoconfigure.EnableAutoConfiguration指定的自动配置类;

 springBoot有两种配置类,一种是普通的配置类,一种是自动配置类。

普通配置类,在类上方标一个注解,@Configu/ration

自动配置类,注解的同时,还要写在/META-INF/spring.factories中的;

3.写一个自己的排除器

说了那么多,到底要写什么嘞?

我们可以自定义一个排除器,用来过滤某些bean,话不多说,直接上代码

首先,在resources下面建立一个META-INF文件夹,再建立一个spring.factories文件

# Initializers
org.springframework.context.ApplicationContextInitializer=\
com.MyApplicationContextInitializer

这里指定了com包下面的MyApplicationContextInitializer类

package com;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
public class MyApplicationContextInitializer implements ApplicationContextInitializer {
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        // 往IOC容器中注册一个单例Bean(在IOC容器初始化后,@ComponentScan组件扫描之前执行)
        applicationContext.getBeanFactory().registerSingleton("myTypeExcludeFilter",new MyTypeExcludeFilter());
    }
}

看代码,我们还要建立一个MyTypeExcludeFilter的类

import java.io.IOException;
public class MyTypeExcludeFilter extends TypeExcludeFilter {
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        // 排除HelloController
        return metadataReader.getClassMetadata().getClassName().equals(HelloController.class.getName());
    }
}

这是直接将HelloController里的路径全都排除,也就是说,你现在访问不到这个路径了

这是helloController里的代码

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }
    @GetMapping("/ok")
    public String ok(){
        return "ok";
    }
}

先不开启排除器,我们先把spring.factories的代码注释掉,测试一下

现在恢复文件的代码,再次启动 ,就会发现它404了

Spring Boot自定义拦截可以用来拦截请求并在请求前或请求后执行一些操作,比如记录日志、鉴权等。下面是一个简单的例子: 1. 创建一个拦截类,实现HandlerInterceptor接口,并实现其中的三个方法:preHandle、postHandle、afterCompletion。 ``` public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理之前进行调用(Controller方法调用之前) return true; // 只有返回true才会继续向下执行,返回false取消当前请求 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后) } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在整个请求处理完成后进行调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要用于资源清理工作) } } ``` 2. 创建一个配置类,注册拦截。 ``` @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // 注册拦截 registry.addInterceptor(myInterceptor) .addPathPatterns("/api/**") // 拦截的路径 .excludePathPatterns("/api/login"); // 排除的路径 } } ``` 在上面的例子中,我们创建了一个MyInterceptor拦截类,并实现了其中的三个方法。然后,我们创建了一个InterceptorConfig配置类,并在其中注册了MyInterceptor拦截,并指定了拦截的路径和排除的路径。这样,所有以/api/开头的请求都会被MyInterceptor拦截拦截,除了/api/login路径的请求。 以上就是Spring Boot自定义拦截简单示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值