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