摘要:目前只是一个后台模块,希望自己技能增强到一定时,可以把的融合进来。目录第一站,分析了启动类。看见没,这个也是配置类,它声明了视图解析器地域解析器以及静态资源的位置,想起来没,就是前置,后置。程序启动类我们点击源码看看。
Guns基于SpringBoot,致力于做更简洁的后台管理系统,完美整合springmvc + shiro + 分页插件PageHelper + 通用Mapper + beetl!Guns项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块),可以直接作为一个后台管理系统的脚手架.
说明如果您有幸能看到,请认阅读以下内容;
1、本项目临摹自abel533的Guns,他的项目 fork 自 stylefeng 的 Guns!开源的世界真好,可以学到很多知识。
2、版权归原作者所有,自己只是学习使用。跟着大佬的思路,希望自己也能变成大佬。gogogo》。。
3、目前只是一个后台模块,希望自己技能增强到一定时,可以把stylefeng 的 [Guns]融合进来。
4、很多总结的文档都来自abel533的GiHub的README.md.为了方便自己复习就拿来主义了。
5、note里面是自己的学习过程,菜鸟写的,不是大佬写的。内容都是大佬的。
目录1、SpringBoot第一站,分析了启动类。还有各种自动配置的源码点这里
2、
修改说明本项目对 Guns 的改动为:
1、将 mybatis-plus 改成了通用 Mapper.
2、增加分页插件 PageHelper.
3、去掉com.stylefeng.guns.modular.system.dao包中的所有DAO,将方法放到对应的Mapper接口中.
4、将 Mapper.xml 移动到 resources 中
关于两者的对比,可以通过 commit 信息查看。
功能简介1、用户管理
2、角色管理
3、部门管理
4、菜单管理
5、字典管理
6、业务日志
7、登录日志
8、监控管理
9、通知管理
10、代码生成
1、首先我们来看包结构,老样子,我们先从core包开始,然后common,在config。等等,还是先从启动类开始吧。
项目包结构说明├─main │ │ │ ├─java │ │ │ │ │ ├─com.guo.guns----------------项目主代码(原来的包:com.stylefeng.guns) │ │ │ │ │ │ │ ├─common----------------项目公用的部分(业务中经常调用的类,例如常量,异常,实体,注解,分页类,节点类) │ │ │ │ │ │ │ ├─config----------------项目配置代码(例如mybtais-plus配置,ehcache配置等) │ │ │ │ │ │ │ ├─core----------------项目运行的核心依靠(例如aop日志记录,拦截器,监听器,guns模板引擎,shiro权限检查等) │ │ │ │ │ │ │ ├─modular----------------项目业务代码 │ │ │ │ │ │ │ ├─GunsApplication类----------------以main方法启动springboot的类 │ │ │ │ │ │ │ └─GunsServletInitializer类----------------用servlet容器启动springboot的核心类 │ │ │ │ │ └─generator----------------mybatis-plus Entity生成器 │ │ │ ├─resources----------------项目资源文件 │ │ │ │ │ ├─gunsTemplate----------------guns代码生成模板 │ │ │ │ │ ├─application.yml----------------springboot项目配置 │ │ │ │ │ └─ehcache.xml----------------ehcache缓存配置 │ │ │ └─webapp----------------web页面和静态资源存放的目录 │
注:SpringBoot项目默认不支持将静态资源和模板(web页面)放到webapp目录,但是个人感觉resources目录只放项目的配置更加简洁,所以就将web页面继续放到webapp目录了.
1、先来看启动类:
/** * SpringBoot方式启动类 */ @SpringBootApplication public class GunsApplication extends WebMvcConfigurerAdapter { protected final static Logger logger = LoggerFactory.getLogger(GunsApplication.class); public static void main(String[] args) { SpringApplication.run(GunsApplication.class,args); logger.info("GunsApplication is success!"); } }
需要注意两个点:@SpringBootApplication注解和WebMvcConfigurerAdapter
(1)、1.2版本应该是@Configuretion注解,这个注解表明这个类会处理Spring的常规bean。来自《精通Spring MVC》
(2)、@ComponentScana 它会告诉Spring去哪里查找SPring组件(服务,控制器),大白话就是bean那。一般我们在控制层的类上会加上@Controller注解,不知道大家有木有配置过XML,难受啊。
(3)、@EnableAutoConfiguration : 看名字,AutoConfiguration啊,这就是Spring魔力所在,省去很多XXML了,在这里是基于JavaConfig配置的。
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication { Class>[] scanBasePackageClasses() default {}; } ------------------------------------------------------- @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }
2、接下来,我们再看下为毛要继承WebMvcConfigrerApapter类。
看见Config没,这个也是配置类,它声明了视图解析器、地域解析器、以及静态资源的位置,(想起来没,就是前置,后置)
。
先看一段源码 ————源码是个好东西
----------------------InternalResourceViewResolver熟悉吗?----------------------- @Bean @ConditionalOnMissingBean public InternalResourceViewResolver defaultViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix(this.mvcProperties.getView().getPrefix()); resolver.setSuffix(this.mvcProperties.getView().getSuffix()); return resolver; } ---------------------------也是视图解析器,只是返回的是bean------------------------- @Bean @ConditionalOnBean({View.class}) @ConditionalOnMissingBean public BeanNameViewResolver beanNameViewResolver() { BeanNameViewResolver resolver = new BeanNameViewResolver(); resolver.setOrder(2147483637); return resolver; } -------------------------------地域解析器-------------------------------------------- @Bean @ConditionalOnMissingBean @ConditionalOnProperty( prefix = "spring.mvc", name = {"locale"} ) public LocaleResolver localeResolver() { if(this.mvcProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.WebMvcProperties.LocaleResolver.FIXED) { return new FixedLocaleResolver(this.mvcProperties.getLocale()); } else { AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver(); localeResolver.setDefaultLocale(this.mvcProperties.getLocale()); return localeResolver; } }
说了这么多,我们先来看看SpringMVC启动流程,知其所以然的同时也要知其然。
一般来说,初始化 步骤如下:
1、初始化SpringMVC的DispatcherServlet
2、配置转码过滤器(UTF-8,乱码锅就在设置,还有一个就是在发送信息前,setCharacterEncoding()。),保证能正确转码,为啥啊,因为浏览器发送的是ISO-8859?。
3、配置视图解析器,就上面说的那个,返回视图的时候方便定位。
4、配置静态资源的位置,
5、还有就是配置multipart解析器,主要是为了能上传文件,part单词什么意思?多个-部分
6、还需要写错误页面,统一异常处理。
然而,然而有了SpringBoot,统统可以省略,激动吗?兴奋吗? 我是蛮激动的,尤其第一次运行SpringBoot项目。
上面已经帮我们位置了视图解析器,接下来我们看下DispatcherServlet和multipart
@AutoConfigureOrder(-2147483648) @Configuration @ConditionalOnWebApplication @ConditionalOnClass({DispatcherServlet.class}) //只有对应的类在classpath中有存在时才会注入 @AutoConfigureAfter({EmbeddedServletContainerAutoConfiguration.class}) public class DispatcherServletAutoConfiguration { public static final String DEFAULT_DISPATCHER_SERVLET_BEAN_NAME = "dispatcherServlet"; //熟悉吗?DeFAULT,默认的那。 public static final String DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME = "dispatcherServletRegistration"; public DispatcherServletAutoConfiguration() { } -------------------------------MultipartResolver------------------------------- @Bean @ConditionalOnBean({MultipartResolver.class}) @ConditionalOnMissingBean( name = {"multipartResolver"} ) public MultipartResolver multipartResolver(MultipartResolver resolver) { return resolver; } }
还有还有,错误配置、转码配置、tomcat配置Jetty等等。具体的在这个配置类中EmbeddedServletContainerAutoConfiguration,只看ContainerAutofig。我们还是正式进入项目吧。
/** * Guns Web程序启动类 */ public class GunsServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(GunsApplication.class); } }
我们点击源码看看SpringBootServletInitializer。其实看名字就可看出是Servlet初始化,熟悉设这个ApplicationContext单词吗?应用上下文。很重要的,还有一个叫做BeanFactory,主要有个getBean方法,一般用前者。不懂的可以去看看我临摹别人的简单版Spring框架点这里
public abstract class SpringBootServletInitializer implements WebApplicationInitializer { protected WebApplicationContext createRootApplicationContext(ServletContext servletContext) {} protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder; } }
今晚就先到这里吧,明早gogogo
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68657.html
摘要:因为抽象类天生就是用来被继承的。由于不支多继承,子类不能够继承多个类,但可以实现多个接口如果基本功能在不断改变,那么就需要使用抽象类。全局异常处理接下来,我们在看看控制统一的异常拦截机制。 3、Spring Boot 缓存配置、全局异常处理 说明 如果您有幸能看到,请认阅读以下内容; 1、本项目临摹自abel533的Guns,他的项目 fork 自 stylefeng 的 Guns!...
摘要:序列化的类可显式声明的值,这个中定义异常和中定义方式几乎一样。工具类初始化是为每个序列化类产生的版本标识,可用来保证在反序列时,发送方发送的和接受方接收的是可兼容的对象。 common.exception、annotation、node、page 说明 如果您有幸能看到,请认阅读以下内容; 1、本项目临摹自abel533的Guns,他的项目 fork 自 stylefeng 的 Gu...
摘要:总体介绍在互联网金融行业一百多亿其实也算不上大平台,也就是二级阵营吧,其实每次的架构升级都是随着业务重大推进而伴随的,在前一代系统架构上遇到的问题,业务开发过程中积累一些优秀的开发案例,在下一代系统开发中就会大力推进架构升级。 回想起从公司成立敲出的第一行代码算起到现在也快三年了,平台的技术架构,技术体系也算是经历了四次比较重大的升级转化(目前第四代架构体系正在进行中),临近年底也想抽...
摘要:总体介绍在互联网金融行业一百多亿其实也算不上大平台,也就是二级阵营吧,其实每次的架构升级都是随着业务重大推进而伴随的,在前一代系统架构上遇到的问题,业务开发过程中积累一些优秀的开发案例,在下一代系统开发中就会大力推进架构升级。 回想起从公司成立敲出的第一行代码算起到现在也快三年了,平台的技术架构,技术体系也算是经历了四次比较重大的升级转化(目前第四代架构体系正在进行中),临近年底也想抽...
阅读 1432·2023-04-25 19:51
阅读 1928·2019-08-30 15:55
阅读 1741·2019-08-30 15:44
阅读 2698·2019-08-30 13:58
阅读 2691·2019-08-29 16:37
阅读 1071·2019-08-29 15:34
阅读 3995·2019-08-29 11:05
阅读 2619·2019-08-28 17:51