手把手教你SpringBoot+MyBatis+Shiro 搭建项目框架
写在前面的话
一直想能仿公司框架的形式,着手做一个简单的脚手架,一来是带着目标性能更好地学习,接触新的技术,另外自己如果有什么想要实现的简单需求,就可以进行快速开发,主要还是希望能在权限上有所控制,所以最花时间的还是在Shiro上。
zheng(https://gitee.com/shuzheng/zheng) 基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构,提供整套公共微服务服务模块
ES(https://github.com/zhangkaitao/es) JavaEE企业级项目的快速开发的脚手架,提供了底层抽象和通用功能,拿来即用
renren-security(https://www.renren.io/) 轻量级权限管理系统
lenos(https://gitee.com/bweird/lenosp) 快速开发模块化脚手架
1、技术框架整合
1.1 Maven多模块项目的搭建
参考链接:
为什么要搭建多模块项目?
Maven最佳实践:划分模块(http://juvenshun.iteye.com/blog/305865)
maven构建企业级多模块项目(最好的划分模块方式)(https://blog.csdn.net/program_guys/article/details/76407360)
多模块项目如何搭建?
Maven的多模块 Spring MVC + Spring + Mybatis 项目的搭建(http://www.leeyom.top/2017/08/01/tech-maven-multi-module-ssm/)
SpringBoot多模块项目实践(Multi-Module)(https://segmentfault.com/a/1190000011367492)
1.2 SpringBoot-MyBatis集成
参考链接:
Spring Boot 集成MyBatis(https://blog.csdn.net/isea533/article/details/50359390) mybatis-spring-boot-autoconfigure(http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/)
1.3 SpringBoot-Shiro集成
参考链接:
Shiro用starter方式优雅整合到SpringBoot中(https://segmentfault.com/a/1190000014479154#articleHeader0) Spring Boot 集成-Shiro Shiro下简单的RBAC(Realm及相关对象)(http://jinnianshilongnian.iteye.com/blog/2022468)
2、踩坑警告
SpringBoot 版本:2.0.3.RELEASE JUnit 版本:4.12 SpringBoot-MyBatis 版本:1.3.2 SpringBoot-Shiro 版本:1.4.0-RC2
2.1 多模块带来的注意事项
另外需要注意的是,SpringBoot中 的 Bean 扫描默认为 Application.java 所在包及子包,所以哪怕是多模块,也请注意包名的问题,并调整 Application.java 的位置,否则很容易出现找不到 Bean 注入的情况。
2.2 SpringBoot+MyBatis与单元测试
@Repository
@Mapper
publicinterface RoleDao {
int deleteByPrimaryKey(Long id);
int insert(Role record);
int insertSelective(Role record);
Role selectByPrimaryKey(Long id);
int updateByPrimaryKeySelective(Role record);
int updateByPrimaryKey(Role record);
Set<Role> findAll();
Set<Role> findByUserId(Long userId);
}
2.3 Shiro中自定义Realm的Bean注册
在 SpringBoot 和 Shiro 的集成中,Shiro的配置通常是使用一个自定义配置类,通过在方法上使用 @Bean 注解来将配置注册成 Bean,如下:
@Configuration
publicclass ShiroConfig {
@Bean
public Realm realm() {
returnnew MyRealm();
}
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chain = new DefaultShiroFilterChainDefinition();
//todo "/anon" not useful
chain.addPathDefinition("/anon/*", "anon");
chain.addPathDefinition("/authc/*", "authc");
return chain;
}
}
那么在自定义的Realm中还需要单独的注解(如 @Component)标记吗?答案是不需要。如下,哪怕它之中还需要用到其他的 Bean 组件,也不需要再单独做组件注解了(加上反而因为和 @Bean 的方式冲突报错):
//无需 @Component
publicclass MyRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
returnnull;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//...
returnnull;
}
}
另外需要注意的是,在配置url访问权限时,如下两种写法请注意:
chain.addPathDefinition("/anon", "anon"); //无效 chain.addPathDefinition("/anon/*", "anon"); //有效
3、Demo源码
deng-cc / baseMan-demo-init
1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结
5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...