SpringBoot
1. what
springboot也是spring公司开发的一款框架。为了简化spring项目的初始化搭建的。
spring项目搭建的缺点:
- 配置麻烦
- 依赖繁多
- tomcat启动慢
2 .springboot的特点(why)
- 自动配置
springboot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是SpringBoot自动完成的
- 起步依赖
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
- 辅助功能
提供了一些大型项目中常见的非功能性特性,如嵌入式服务器tomcat、安全、指标,健康检测、外部配置等。
3. 搭建springboot的项目(how)
4. springboot常用的配置文件种类
springboot提供了两种配置文件。
- 后缀为properties的文件
- 后缀为yml的文件
不管是哪种,它们的前缀都是application
-
yaml文件格式
冒号后面有空格,空格后面才是自己要填写的值
server:port: 8080servlet:context-path: /aaa
-
properties文件格式
spring.application.name=demo2spring.profiles.active=test student.name=lay student.age=18 student.sex=man
如果上面两个文件同时存在,properties优先级高
5. springboot中java如何读取配置文件中的内容【重点】
我们习惯把一些自己的信息放入配置文件中,便于修改。比如OSS、支付等。我们还希望通过java代码能够读取到配置文件中自己的信息
springboot提供了两种方式用于读取springboot配置文件中信息的方式
- 使用@ConfigurationProperties注解
使用在类上@ConfigurationProperties(prefix=“前缀”)
可以读取任意类型
- Student类,将@ConfigurationProperties添加到实体类上
@ConfigurationProperties(prefix = "student")
@Component//为类创建spring,而且在创建时自动读取配置文件中前缀为student的属性
@Data
public class Student {//名称必须和配置文件中的名称一致private String name;private String age;private String sex;
}
- Controller类
@RestController
public class StudentController {@Autowiredprivate Student student;@GetMapping("/info")public Student info(){return student;}
}
结果返回student中各个属性中的具体值
- 使用@Value注解
它只能读取基本类型和字符串类型
- controller层,将@Value注解添加到具体属性上
@RestController
public class StudentController {@Value("${student.name}")private String xm;@GetMapping("/info")public String info(){return xm;}
}
结果仅返回student中的具体姓名
@Component注解
标注一个类为Spring容器的Bean,把普通pojo实例化到Spring容器中,相当于配置文件中的<bean id=“” class=“”/>
@ConfigurationProperties注解
允许开发者将外部的配置属性自动绑定到 JavaBean 对象上
6. profile多环境配置【重点】
我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都有修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的
- profile配置方式
- 多profile文件方式
- yml多文档方式
- profile激活方式
- 配置文件
- 命令行参数
我们需要针对不同的环境来创建不同的配置文件。使用profile来激活对应的配置文件
比如:
application-dev.properties [开发环境的配置文件]
application-test.properties [测试环境的配置文件]
application-pro.properties [生产环境的配置文件]
------------------------------------------------
相同配置依然还是放在application.properties中
不同配置对应放置
如何激活对应的配置文件:两种方式
- 在application配置文件中激活
#激活对应环境的配置文件
spring.profiles.active=pro
- 部署时激活对应环境的配置
命令行参数:java –jar xxx.jar --spring.profiles.active=dev
7. springboot注册web组件
web组件表示的就是servlet,filter过滤器组件
回顾servlet组件步骤
- 创建一个类并继承HttpServlet重写service方法
- 注册到web.xml文件中
-
创建一个类并继承HttpServlet重写service方法
-
实例
public class MyServlet extends HttpServlet {//重写父类中的方法.接受参数以及业务处理@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {System.out.println("代码~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");} }
在web.xml文件中注册该servlet,后续有简化方法,即在相应的类中添加注解
@WebServlet注解
参数:name:该servlet的name
urlPatterns:该servlet的路径
-
-
在web.xml文件中注册servlet
-
实例
<!--注册servlet--><servlet><!--servlet的名称可以随便起--><servlet-name>myServlet</servlet-name><!--指定自定义的servlet路径--><servlet-class>com.ykq.servlet.MyServlet</servlet-class></servlet><!--请求路径映射到该servlet--><servlet-mapping><!--保证该名称必须和上面注册的名称一致--><servlet-name>myServlet</servlet-name><!--路径,可以随意定义,但必须加/--><url-pattern>/my</url-pattern></servlet-mapping>
-
思考:在springboot中没有web.xml文件,如何注册servlet?
提供了一个配置类
创建一个Servlet
public class MyServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("~~~~~~~~~~~~~~~~");}
}
创建一个配置类
@Configuration
public class MyConfig {//注册servlet@Beanpublic ServletRegistrationBean myServlet(){ServletRegistrationBean bean=new ServletRegistrationBean<>();bean.setName("mys");bean.setServlet(new MyServlet());bean.addUrlMappings("/myServlet");return bean;}
}
回顾filter过滤器步骤
- 创建一个类并实现Filter接口,重写doFilter方法
- 注册到web.xml文件中
- 创建一个类并实现Filter接口,重写方法
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//初始化过滤器-只有一次}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//过滤规则System.out.println("====过滤器====");//放行filterChain.doFilter(servletRequest,servletResponse);System.out.println("===过滤器放行了===");}@Overridepublic void destroy() {//销毁过滤器-浏览器或服务器关闭时}
}
- 在web.xml文件中注册
<!--注册过滤器--><filter><filter-name>MyFilter</filter-name><filter-class>com.ykq.filter.MyFilter</filter-class></filter><!--过滤规则--><filter-mapping><filter-name>MyFilter</filter-name><!--/*:表示拦截所有的请求/views/*: 只拦截包含views/资源/*.do: 拦截请求后缀未.do资源--><url-pattern>/*</url-pattern></filter-mapping>
spring如何注册filter,同注册servlet同理
创建一个filter
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("经过了过滤器");}@Overridepublic void destroy() {Filter.super.destroy();}
}
创建一个配置类
@Configuration
public class MyConfig {//注册过滤器@Beanpublic FilterRegistrationBean myFilter(){FilterRegistrationBean filter=new FilterRegistrationBean();filter.setName("my");filter.setFilter(new MyFilter());filter.addUrlPatterns("/bn");return filter;}
}
@Configuration注解
是Spring的注解。
作用:声明一个类为配置类,用于取代bean.xml配置文件注册bean对象
用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
8. springboot包扫描的原理
ssm项目必须加包扫描,而现在springboot没有写包扫描了
自动扫描主类所在的包
因为自带了包扫描的功能,核心在主类的注解@SpringBootApplication上,它是一个复合注解
里面包含@EnableAutoConfiguration开启自动配置
上述注解里面包含注解@AutoConfigurationPackage
上述注解里面包含注解@Import({AutoConfigurationPackages.Registrar.class}),需要导入一个自动配置包的类。加载主类所在的包,并按照该包进行扫描
如果我们不想让它扫描主类所在的包,我们可以使用@ComponentScan(basePackages={“”}来指定自己的包
通过@ComponentScan注解指定扫描自己的包,默认的包扫描消失
9. springboot的自动装配原理
我们原来的ssm项目,都需要加载前端控制器DispatcherServlet,而现在的springboot并没有加载DispatcherServlet。springboot具备自动装配的功能
springboot启动时,加载了使用@SpringBootApplication注解的类
该注解是一个复合注解,包含了@EnableAutoConfiguration注解,该注解开启了自动装配功能,该注解也是一个复合注解。
里面包含@Import({EnableAutoConfigurationImportSelector.class}),导入EnableAutoConfigurationImportSelector,该类自动装配选择器类,该类会自动加载很多自动装配。每个自动装配都会完成对应的自动装配功能。