1.什么是SpingBoot
SpringBoot基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。
2.为何使用SpringBoot
(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。
3.如何创建SpringBoot工程
创建SpringBoot工程有两种方法。
第一种:快速搭建(需要联网)
新建项目--选择 Spring Initializr 服务创建SpringBoot应用程序
更换服务器URL,默认的URL是国外的镜像源,更换为 https://start.aliyun.com 使用国内的阿里云镜像源,速度更快--下一步
选择SpingBoot版本,建议版本第一点,推荐2.6或2.4版本,然后点击Web勾选Spring Web进行创建
第二种:手动搭建
新建项目--选择新建项目,构建系统选择Maven--创建
在pom文件种引入SpringBoot的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
在resources目录下创建 application.properties文件或 application.yml,这边选择第二种,需要注意的是yml文件在:后输入值的话需要用空格隔开,并且yml属于层级关系,这个不能乱。
在java目录下创建com.boot.SpringBootApplicationMain主启动类
@SpringBootApplication
public class SpringBootApplicationMain {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplicationMain.class, args);
}
}
添加启动类注解,以及main方法启动项目,在boot目录下创建演示Controller
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/index")
public Object index(){
return "你好,SpringBoot";
}
}
通过main方法的启动类启动项目,然后访问 localhost:8080/hello/index。结果看出,页面显示了返回值。
4.SpringBoot工程的配置文件
刚刚创建的application.yml就是SpringBoot工程的配置文件,内置了许多配置。
server:
port: 80
student:
name: yp
classes: 6
hobby[0]: sing
hobby[1]: jump
hobby[2]: rap
hobby[3]: basketball
例如,修改服务器的端口号,以及对象的创建。那么如何来获取配置文件内的属性值呢?
获取配置文件内的属性值有两种方法。
第一种:@Value
在controller内,通过@Value注解将配置文件内的属性值赋值给某个属性
@Value("${student.name}")
private String name;
@Value("${student.classes}")
private Integer classes;
@GetMapping("/get")
public String get(){
return "name:"+name + ",class:"+classes;
}
@Value括号内为格式${},花括号内为配置文件内的属性名,然后赋值给一个私有的属性,便可以在方法中使用这个属性。
运行查看 localhost:8080/hello/get 结果:返回了yp和6
第二种:@ConfigurationProperties
为何使用这种方法,因为第一种方法只能获取基础的数据类型和字符串类型的值,而定义的hobby数组则无法进行获取,第二种方式的用法是在一个对象上方添加该注解,但该类需要被Spring容器来管理所有需要添加@Component注解,并且需要Get和Set方法,所以引入lombok依赖,添加@Data依赖。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
@Data
@Component
@ConfigurationProperties(prefix = "student")
public class Student {
private String name;
private Integer classes;
private String[] hobby;
}
@ConfigurationProperties括号内有一个prefix前缀参数,如果接收的属性值都属于一个对象,那么在prefix加上该对象名称,并定义属性来接受这些值,这里定义了一个字符串数组来接收配置文件中的数组。
因为现在这个类已经被Spring容器来进行管理了,所以我们可以在controller中通过自动注入的方式来获取这个类了。
@Autowired
private Student student;
@GetMapping("/stu")
public Student stu() {
return student;
}
通过注入获得类,然后将此类返回并运行查看结果,页面就显示了配置文件中的值。
5.SpringBoot注册Web组件
我们在使用Springmvc框架进行开发的时候,Web组件会自动将我们的Servlet和Filter注册进web.xml文件中,那么使用SpringBoot开发时,并没有web.xml文件,应该如何去进行注册呢?可以通过配置的方式将组件注册进去。
创建一个Servlet和Filter
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Do Get");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Do Post");
}
}
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter");
filterChain.doFilter(servletRequest, servletResponse);
}
}
然后将Servlet和Filter注册进SpringBoot,在boot目录下创建config.MyConfig配置类。
@Configuration
public class MyConfig {
@Bean
public ServletRegistrationBean<Servlet> servletServletRegistrationBean(){
ServletRegistrationBean<Servlet> servletServletRegistrationBean = new ServletRegistrationBean<>();
servletServletRegistrationBean.setServlet(new MyServlet());
servletServletRegistrationBean.setName("MyServlet");
servletServletRegistrationBean.addUrlMappings("/my");
return servletServletRegistrationBean;
}
@Bean
public FilterRegistrationBean<Filter> filterFilterRegistrationBean(){
FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
filterFilterRegistrationBean.setFilter(new MyFilter());
filterFilterRegistrationBean.setName("MyFilter");
filterFilterRegistrationBean.addUrlPatterns("/*");
return filterFilterRegistrationBean;
}
}
配置类需要在类上添加配置注解,第一个bean为Servlet组件,ServletRegistrationBean为注册Servlet的bean,在bean中创建一个Servlet的注册器,并设置Servlet,名称,路径。第二个bean为Filter组件,FilterRegistrationBean为注册Filter的bean,在bean中创建一个Filter的注册器,设置Filter,名称,添加拦截的路径。
启动访问 localhost:8080/my 并查看控制台输出结果
执行了过滤器和DoGet方法,说明Web组件注册成功了!
6. SpringBoot自动扫描包的原理
查看@SpringBootApplication注解,可以看到它是一个复合注解
在@EnalbeAutoConfiguration注解,可以通过名字知道他是一个开启自动配置的注解。进入该注解。
在@AutoConfigurationPackage注解,通过名字知道他是一个自动配置包,那他是如何获取到包呢,进入这个注解内。
在Import注解中,看到他导入了一个注册包的反射类,进入该类中,可以看到一个方法
通过该方法可以看出,该方法调用注册方法,通过getPackageNames()方法获取到包名进行了注册,所以可以得出:
SpringBoot默认扫描的是带有@SpringBootApplication注解的主启动类父级包下的所有子包和子类,通过上述方法获取包路径来获取包名进行注册类,再通过自动装配包,将类进行自动装配,最后开启自动装配。
7.如何扫描自定义包下的类
在主启动类里,通过@ComponentScan()注解在括号内传入basePackages = { },花括号内传入包的全路径并用引号包裹,但该方法会覆盖原本的默认扫描路径。