自定义本身的Listener,继承须要重写的监听器。web
方式一:直接在自定义监听器上面添加注解@WebListener,可是单纯这样是不会被扫描到的(实测不能),因此咱们须要加@Component注解,实测@Configuration也行。@WebListener的属性value是对改Listener的描述,感受没有做用。spring
Controller接口:tomcat
须要使用session,session才会初始化。springboot
看控制台输出:session
启动项目,初始化ServletContext测试
访问接口localhost:8080/test2,使用session,初始化session:url
方式二:自定义接口中不写@Component或者@configuration注解,只要@WebListener注解,在启动类中添加注解@ServletComponentScan注解,效果与上面同样。spa
Filter的使用配置方式个Listener是同样的,这里就不讨论了,直接使用在启动类添加注解@ServletCompnentScan的方式。3d
自定义Filter:blog
MyFilter:
Myfilter2:
能够看到两个Filter上面的注解@WebFilter:
属性: value:配置须要过滤的url路径,/*表示全部,类型String[]
urlPartterns:跟value同样
filterName:过滤器的名字,若是重复,会引发覆盖(这个在另一种方式会提到)。
启动项目:
过滤器中doFilter方法当中,chain.doFilter(request, response)必须写,目的是该过滤器完成后,交给后边的过滤器继续执行,若是不写,则直接在此处中断。
访问url:
能够看到过滤器2拦截路径/test,不会拦截到/test2,过滤器已经生效。
过滤器的执行过程(跟Listener有点点相似):
注意箭头的到达的地方:
这种@ServletComponentScan的配置方式,过滤器的执行顺序暂时还没找到方法控制,测试@Order注解对Filter的执行顺序无效。可是,不使用@ServletComponentScan,改为使用@Component注解的方式的话,@Order对Filter的执行顺序就有做用了,值越小优先级越高(如图)。或者使用后面的@Bean的方式配置能够指定顺序。
控制台输出:
此种方式会用到两个类:
FilterRegistrationBean和ServletListenerRegistrationBean
在官方文档part IV .27.3.可是没有讲怎么使用,用法是百度的。
使用该方式的时候自定义过滤器上面不须要有任何注解,只须要继承Filter便可。
直接在主类中添加@Bean代码(固然,也能够从新建一个类写,为该类添加@Configuration注解便可):
这里会出现两个FilterRegistrationBean,两个都是能够用,建议使用web.servlet的,context.embedded中的是web.servlet中的子类,并且已通过时。
注意:有多少个Filter就要写多少个@Bean方法。
优先级:setOrder方法就是用来设置Filter的执行顺序。值越小,优先级越高。
如今讲MyFilter2设置成1,MyFilter设置成2:执行结果:
Listener的配置和Filter的同样,使用@Bean的方式能够不用在子类上添加任何注解,只须要继承须要的Listener便可,测试经过。
示例工程:springboot-learn
自定义class,继承CommendLineRunner,实现run方法。
启动时加载数据会在tomcat启动完以后加载数据,看结果:
注解@Order能够决定加载的顺序,值越小优先级越高。
over~~~