最近接触了springBoot,springMVC,spring,在springBoot项目中了解到,它是不需要配置tomcat的,因为内置是有tomcat的。
1.spring优缺点
优点 | 缺点 |
---|---|
通过ioc,aop管理bean对象,节省了内存空间,更好的编写业务逻辑,解除耦合 | 1.虽然组件是轻量级,但是配置是重量级的。2.依赖管理问题,spring的依赖需要保持一致,同时需要避免依赖冲突问题 |
2.SpringBoot的基本原理
(1)SpringBoot的优势
<1>springboot是对spring+springmvc的封装,基本功能并没有增加。将繁琐
的配置,进行自动化的管理,不再需要配置文件。<2>springboot使用依赖传递的功能,只需要引入父层依赖,其他的依赖的版
本由父层springboot来进行管理,避免了依赖冲突问题。
(2)SpringBoot的特点
<1>提供了快速使用spring的一种方式
<2>提供当前springboot的一些环境,以及内存,以及健康状况
<3>开箱即用,不需要任何配置信息,就可以使用springboot,但是代码层面与spring+springmvc相同
(3)SpringBoot的注意事项
<1>springBoot 是不需要配置tomcat的,因为在springboot的依赖中 spring-boot-starter-web中已经内置了tomcat,帮助我们启动项目。
<2>对于启动类,是我们springboot的一个入口,同时启动类上方需要加入注解@SpringbootApplication 标识当前类为启动类。在springboot工程中,通常只有一个启动类.。
<3>根据springboot的自动装配原理可知,当我们在Pom中引入某个组件,或者框架后,springboot启动时,会装配该框架,组件的环境,我们就需要有该框架/组件的配置信息,如果没有,则会报错,或者说,引入pom依赖后,不想使用则需要在启动类@SpringBootApplication(exclude=配置.class)排除掉该配置类.
<4>通过springboot的启动类启动项目时,默认会加载启动类,同级,或者下级的包的注解。如果启动类在单独的一个包中,则需要配置scanBasePackages 告诉springboot启动时,需要扫描的包路径.
(4)SpringBoot的启动原理
<1>从启动类入手,跟踪启动的流程,大致为:
run->SpringApplication->ConfigurableApplicationContext
->StopWatch 声明监听器->开始监听项目的启动时间
->ConfigurableApplicationContext(配置文件应用容器)
->exceptionReporters (异常记录)
->configureHeadlessProperty(配置属性)
->getRunListeners(项目启动监听器)
->listeners.starting();
启动监听->(springBoot启动的准备工作)
启动的核心代码是: refreshContext(context); //刷新容器 -->执行了spring的bean创建逻辑
<2>如何来改变启动的banner图,SpringApplicationBannerPrinter 该类是banner图的基类,如果我们想要改变banner图,可以在resources 资源目录下,创建 banner.txt文件,启动时,会读取该文件的内容,进行打印。
(5)springboot的自动装配原理
<1>当springBoot引入某个组件依赖时,springBoot会在启动时,自动装配该
组件的环境,如,引入了Mybatis
需要操作数据时,会在启动springboot时,创建SqlSessionFactory,如果没有
配置有关数据库的信息,则会报错,无法启动该项目。<2>springBoot是如何发现你引入了该依赖,并且需要配置环境呢。在
@SpringBootApplication注解中有一个注解@EnableAutoConfiguration(自
动装配配置类)。在@EnableAutoConfiguration中有一个
@Import(AutoConfigurationImportSelector.class)
自动装配选中的组件<3>在AutoConfigurationImportSelector
中的selectImports方法中,会将springboot默认集成的所有的框架/组件,进
行加载(org.springframework.boot:spring-boot-autoconfiguration中,
META-INF中的spring.factories)在spring.factories
中维护了110个springboot默认集成的框架/组件,在selectImports中会扫描
spring.factories
进行加载,同时根据pom中的引入的依赖信息,判断需要加载哪些基本配置
类,如果默认的只有springboot-starter-web得话,只有24个基本配置类,每
增加一个pom依赖,则加载的配置类会进行对应的添加。<4>约定大于配置的思想
(6)springboot的配置文件
<1>.properties 在properties中是以key=value来进行配置的
server.
port=端口号
<2>.yaml 在yaml中是以父子结构来进行配置 中间以:进行分割
server:
port: 端口号
<3>.yml 与第二种配置的方式一致
server:
port: 端口号
注意:如果三种配置同时存在,则 properties发生效用, 因为properties最后加
载。会将yaml.yml中的以配置好的信息进行覆盖.
3.SpringBoot整合Mybatis
(1)导入pom依赖
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.1</version>
</dependency>
(2)配置数据源
# 配置数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ycy_test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=root
# 配置别名和映射文件路径
mybatis.type-aliases-package=com.ycy.pojo
mybatis.mapper-locations=mapper/*Mapper.xml
(3)编写接口
@Mapper //标识为mybatis的接口 同时交由spring管理
public interface UserMapper {
TbUser findByUserName(@Param("userName")String userName);
}
(4)编写测试类
导入pom依赖
<!--单元测试启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
在test中的java下创建与main的java下的同名以及同级目录,帮助测试类找到springboot的启动类
@RunWith(SpringRunner.class)
@SpringBootTest //启动测试类时,会找到springboot的启动类,先来加载spring的环境,再来进行测试
public class TestUser {
@Autowired
UserMapper userMapper;
@Test
public void testUser(){
TbUser admin = userMapper.findByUserName("admin");
System.out.println(admin);
}
}
4.SpringBoot整合拦截器
(1)定义拦截类
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Admin admin = (Admin) request.getSession().getAttribute("admin");
if(admin!=null){
return true;
}
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
ResponseData responseData = new ResponseData(1,"用户未登录",null,null);
String string = JSON.toJSONString(responseData);
response.getWriter().write(string);
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
(2)配置
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/dept/**").excludePathPatterns("");
}
}
5.SpringBoot整合验证码插件Captcha
(1)导入依赖
(2)添加配置
(3)添加controller
6.SpringBoot整合分页插件
(1)导入依赖
<dependency>
<groupId>com.github.pagehelper</groupId