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