发表于: 2018-04-07 14:40:33
1 592
今天完成的事情:讲一下springboot的一些坑
和spring项目比,主要的差别在于配置文件。springboot里面是用java类代替xml文件完成配置的,类的注册,依赖注入,都是在打了@Configuration的配置类中完成的。springbboot会自动扫描Application所在根目录的包,将打了实现@Component标签的类自动扫描进去(我学习boot的第一个坑,就是把Application类放错位置,然后导致装配失败)。
那么问题来了,他的装配顺序是怎么样的呢?是有序的还是无序的呢?因为这个东西,我实现shiro、druid监控的时候,吃了不少的亏。而关于这两个问题,我也暂时没有确定的结论,网上搜了很多资料,说很多情况下都是无序的。而且boot内嵌了很多东西,更是增加了许多干扰,但是,无论过程如何,我们都是可以通过日志看见结果的(所以说日志真的很重要)。
这里我的日志实现是log4j2,首先是依赖包:
然后在resources文件夹下面新建一个:log4j2.xml,主要就是一个字符集编码和细粒度控制:
回过头来讲一讲刚刚我踩到的坑,就是shiro自定义拦截器的时候,测试拦截器生效顺序的时候,怎么弄都不能正常实现。我这里做了个测试,弄了一个匹配路径为/a/**的拦截器,按道理来说他会优先匹配,后面的拦截器就失效了,然而实际发现并没有:
刚开始我以为是hashmap无序的原因,然后改成了linkedhashmap,然后跑了一遍发现还是不行。然后我改了注入方式(也就是我在之前Spring工程中使用的方式),居然发现还是不行......后来观察日志,才发现原因:
发现login和permission的两个拦截器居然先于我们配置的shiro拦截器注入了!我们想要的效果应该是login和permission两个拦截器依赖注入shiro拦截器中,然后把shiro拦截器装配进boot工程,但是这里相当于是存在两个login(permission)拦截器,并且单独装配了.......因为anno是shiro内置的拦截器,所以他根本不管我们设置的优先级规则,都匹配到了。
所以正确的方法:删除两个拦截器类上面的@Component标签,别让boot自动装配进去
也不要在@Configuration类里面用@Bean标签注册,然后用该方法注入:
而是要像上图一样,直接new一个对象注入进去!!!!!
然而,对于依赖spring自动装配的对象,就不能这样子搞了,必须通过注册的方法完成装配(其实这个方法才是主流,上面那个是特例中的特例,毕竟springboot挂载非spring家族的组件坑比较多)。比如拿shiro的授权管理器来说:
如果你通过new的方法注入,那么myRealm里面的service类就会注入失败。
其实说了这么多,其实就是spring上下文和装配顺序的问题。其他还有一些小问题,比如本项目经测试,shiro是实现了redis一级缓存的,虽然项目在启动的时候依然会出现警告:No cache or cacheManager properties have been set. Authorization cache cannot be obtained.推测原因应该就是刚装配的时候没有成功,在后来通过setter的方式才注入的。
明天计划的事情:学习spring data jpa
遇到的问题:null
收获:总结
评论