1、什么是SpringBoot框架。
SpringBoot是一个快速整合第三方框架;简化xml配置,完全采用注解化;内置http服务器(jetty和tomcat),最终是以java应用程序执行。
注意:SpringCloud底层依赖于SpringBoot实现微服务接口(SpringBoot Web组件集成SpringMVC),采用SpringMVC书写接口。
2、SpringBoot原理分析。
2.1、快速整合第三方框架,原理是:maven子父依赖关系,相当于需要整合的环境的Jar封装好依赖信息。
2.2、完全无配置文件(采用注解化)。如何初始化呢?没有web.xml那么tomcat是如何启动的呢?注解是在spring2.5以上开始,SpringMVC内置注解加载整个SpringMVC容器。使用java代码编写SpringMVC配置初始化。@EnableWebMvc注解。
2.3、内置http服务器,原理是使用java语言创建tomcat容器,加载class文件。
3、代码实现。
3.1、pom.xml文件,需要依赖的jar包。
<dependencies> <!--Java语言操作tomcat --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>8.5.16</version> </dependency> <!-- spring-web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.4.RELEASE</version> <scope>compile</scope> </dependency> <!-- spring-mvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.4.RELEASE</version> <scope>compile</scope> </dependency> <!-- tomcat对jsp支持 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> <version>8.5.16</version> </dependency> </dependencies>
3.2、启动程序的main类。
public class AppTomcat { public static void main(String[] args) throws ServletException, LifecycleException { // 使用Java内置Tomcat运行SpringMVC框架 原理:tomcat加载到 // springmvc注解启动方式,就会创建springmvc容器 start(); } public static void start() throws ServletException, LifecycleException { // 创建Tomcat容器 Tomcat tomcatServer = new Tomcat(); // 端口号设置 tomcatServer.setPort(9090); // 读取项目路径 加载静态资源 StandardContext ctx = (StandardContext) tomcatServer.addWebapp("/", new File("src/main").getAbsolutePath()); // 禁止重新载入 ctx.setReloadable(false); // class文件读取地址 File additionWebInfClasses = new File("target/classes"); // 创建WebRoot WebResourceRoot resources = new StandardRoot(ctx); // tomcat内部读取Class执行 resources.addPreResources( new DirResourceSet(resources, "/WEB-INF/classes", additionWebInfClasses.getAbsolutePath(), "/")); tomcatServer.start(); // 异步等待请求执行 tomcatServer.getServer().await(); } }
3.3、加载SpringMVC的DispatchServlet类。
AbstractAnnotationConfigDispatcherServletInitializer这个类负责"初始化Spring容器、SpringMVC容器、配置DispatcherServlet"。getRootConfigClasses()方法用于获取Spring应用容器的配置文件,这里我们给定预先定义的RootConfig.class;getServletConfigClasses负责获取Spring MVC应用容器,这里传入预先定义好的WebConfig.class;getServletMappings()方法负责指定需要由DispatcherServlet映射的路径,这里给定的是"/",意思是由DispatcherServlet处理所有向该应用发起的请求。
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { // 加载根配置信息 spring核心 protected Class<?>[] getRootConfigClasses() { return new Class[] { RootConfig.class }; } // springmvc 加载 配置信息 protected Class<?>[] getServletConfigClasses() { return new Class[] { WebConfig.class }; } // springmvc 拦截url映射 拦截所有请求 protected String[] getServletMappings() { return new String[] { "/" }; } }
3.4、加载Spring容器
/** * 根容器 * */ @Configuration @ComponentScan("com.xxxx") public class RootConfig { }
3.5、加载SpringMVC容器
正如可以通过多种方式配置DispatcherServlet一样,也可以通过多种方式启动Spring MVC特性。原来我们一般在xml文件中使用<mvc:annotation-driven>元素启动注解驱动的Spring MVC特性。
/** * springmvc 配置信息 * * @EnableWebMvc 开启springmvc 功能<br> */ @Configuration @EnableWebMvc @ComponentScan(basePackages = { "com.xxx.controller" }) public class WebConfig extends WebMvcConfigurerAdapter { // springboot 整合jsp 最好是war // 需要配置视图转换器 // 创建SpringMVC视图解析器 @Bean public ViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/views/"); viewResolver.setSuffix(".jsp"); // 可以在JSP页面中通过${}访问beans viewResolver.setExposeContextBeansAsAttributes(true); return viewResolver; } }
3.6、Controller和Service层方法。
@RestController public class IndexController { @Autowired private UserService userService; @RequestMapping(value = "/index", produces = "text/html;charset=UTF-8") public String index() { // return "纯手写SpringBoot ok啦!!!" return userService.index(); } }
@Service public class UserService { public String index() { return "纯手写SpringBoot2,同时加载UserService ok啦!!"; } }
4、具体源码,请查看码云:https://gitee.com/llsydn_admin_admin/springboot2