sprintboot-learn(二)

本文深入探讨Spring Boot中Listener和Filter的配置与使用方法,包括自定义Listener和Filter的步骤,不同配置方式对执行顺序的影响,以及如何利用@Bean进行精细控制。

Filter和Listener

Listener

自定义自己的Listener,继承需要重写的监听器。

49c326dfef611279a5bcd9519a5ffd5c1b8.jpg

方式一:直接在自定义监听器上面添加注解@WebListener,但是单纯这样是不会被扫描到的(实测不能),所以我们需要加@Component注解,实测@Configuration也行。@WebListener的属性value是对改Listener的描述,感觉没有作用。

ac446b06dab03d4183c57f553af1aa0a9f7.jpg

a866dd228ba9ef29dc9ec27ae01b60f3d95.jpg

Controller接口:

20f2860bd927e56df379b73149e34d84f96.jpg

需要使用session,session才会初始化。

看控制台输出:

启动项目,初始化ServletContext

d78f11f15c3e1f94e1ee65cce8594d7038e.jpg

访问接口localhost:8080/test2,使用session,初始化session:

195a9e73f621964f1b96c9c3d8829e0178a.jpg

方式二:自定义接口中不写@Component或者@configuration注解,只要@WebListener注解,在启动类中添加注解@ServletComponentScan注解,效果与上面一样。

40d4bba46d254e87d35e4f84134e687ff52.jpg

Filter

Filter的使用配置方式个Listener是一样的,这里就不讨论了,直接使用在启动类添加注解@ServletCompnentScan的方式。

自定义Filter:

3c406ef5f518faaf789030e132f7d512386.jpg

MyFilter:

cf7d131d089d04afd54182e62cb6e12fddc.jpg

Myfilter2:

0b41389523dd319b9d00cc3d9c4a4170ae3.jpg

可以看到两个Filter上面的注解@WebFilter:

属性: value:配置需要过滤的url路径,/*表示所有,类型String[]

urlPartterns:跟value一样

filterName:过滤器的名字,如果重复,会引起覆盖(这个在另外一种方式会提到)。

启动项目:

e87d8a430f8d63c87fe61c19a45a93f6993.jpg

过滤器中doFilter方法当中,chain.doFilter(request, response)必须写,目的是该过滤器完成后,交给后边的过滤器继续执行,如果不写,则直接在此处中断。

访问url:

780235f5b32fc8c0095acf93d6d30c3ecb1.jpgf2569701ef5c95d865a65efb3c668946b75.jpg

可以看到过滤器2拦截路径/test,不会拦截到/test2,过滤器已经生效。

过滤器的执行过程(跟Listener有点点类似):

注意箭头的到达的地方:

66074ece0a17b6863857fa16c6fb7682e8e.jpg

这种@ServletComponentScan的配置方式,过滤器的执行顺序暂时还没找到方法控制,测试@Order注解对Filter的执行顺序无效。但是,不使用@ServletComponentScan,改成使用@Component注解的方式的话,@Order对Filter的执行顺序就有作用了,值越小优先级越高(如图)。或者使用后面的@Bean的方式配置可以指定顺序。

65fe22a6329eedaeae352d839a1aed7344f.jpg

618d43cefa31e467ab0c87955ecbaf85deb.jpg

控制台输出:

d5267153cce6b46519a2900bf81db39b69a.jpg

@Bean的方式配置Listener和Filter

此种方式会用到两个类:

FilterRegistrationBean和ServletListenerRegistrationBean

在官方文档part IV .27.3.但是没有讲怎么使用,用法是百度的。

使用该方式的时候自定义过滤器上面不需要有任何注解,只需要继承Filter即可。

直接在主类中添加@Bean代码(当然,也可以重新建一个类写,为该类添加@Configuration注解即可):

520cd4120857abc6c36fad0bf3306e92a1e.jpg

这里会出现两个FilterRegistrationBean,两个都是可以用,建议使用web.servlet的,context.embedded中的是web.servlet中的子类,而且已经过时。

d651fed88795304d8e28a6dbf4eda4e6781.jpg

6e82bdfc43f54acd864a111eff3fbe9c901.jpg

注意:有多少个Filter就要写多少个@Bean方法。

优先级:setOrder方法就是用来设置Filter的执行顺序。值越小,优先级越高。

现在讲MyFilter2设置成1,MyFilter设置成2:执行结果:

4003b99c3283ccdb572054b8ca4c6c065bb.jpg

Listener的配置和Filter的一样,使用@Bean的方式可以不用在子类上添加任何注解,只需要继承需要的Listener即可,测试通过。

506dc03bc7a5bb731007f63f21cd10075a8.jpg

CommendLineRunner启动加载数据

示例工程:springboot-learn

自定义class,继承CommendLineRunner,实现run方法。

9f03ca5f1afafedfc50b7873edd54784c5a.jpg

3fd209bfedcf0a562a6c8ff53ef66878067.jpg

启动时加载数据会在tomcat启动完之后加载数据,看结果:

65a4caae4e8381404968d6cfcef06c6f83f.jpg

注解@Order可以决定加载的顺序,值越小优先级越高。

 

over~~~

转载于:https://my.oschina.net/wtkid/blog/2244949

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值