Guns基于SpringBoot,致力于作更简洁的后台管理系统,完美整合springmvc + shiro + 分页插件PageHelper + 通用Mapper + beetl!Guns项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块),能够直接做为一个后台管理系统的脚手架.java
若是您有幸能看到,请认阅读如下内容;git
一、本项目临摹自abel533的Guns,他的项目 fork 自 stylefeng 的 Guns!开源的世界真好,能够学到不少知识。github
二、版权归原做者全部,本身只是学习使用。跟着大佬的思路,但愿本身也能变成大佬。gogogo》。。web
三、目前只是一个后台模块,但愿本身技能加强到必定时,能够把stylefeng 的 [Guns]融合进来。spring
四、不少总结的文档都来自abel533的GiHub的README.md.为了方便本身复习就拿来主义了。浏览器
五、note里面是本身的学习过程,菜鸟写的,不是大佬写的。内容都是大佬的。缓存
本项目对 Guns 的改动为:tomcat
一、首先咱们来看包结构,老样子,咱们先从core包开始,而后common,在config。等等,仍是先从启动类开始吧。springboot
├─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目录了.bash
一、先来看启动类:
/** * 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 {
}
复制代码
二、接下来,咱们再看下为毛要继承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启动流程,知其因此然的同时也要知其然。
通常来讲,初始化 步骤以下:
然而,然而有了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