sprintboot-learn(二)

Filter和Listener

Listener

自定义本身的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

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的方式配置能够指定顺序。

控制台输出:

@Bean的方式配置Listener和Filter

此种方式会用到两个类:

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便可,测试经过。

CommendLineRunner启动加载数据

示例工程:springboot-learn

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

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

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

 

over~~~

相关文章
相关标签/搜索