zoukankan      html  css  js  c++  java
  • SpringBoot框架

    SpringBoot

    SpringBoot概述

    什么是Spring Boot

    • http://spring.io/projects
    • SpringBoot是Spring项目中的一个子工程
    • 与我们所熟知的Spring-framework 同属于spring的产品
    • 设计目的是用来简化新Spring应用的初始搭建以及开发过程
    • 最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置
    • 做到开箱即用,迅速上手,让我们关注业务而非配置

    为什么要学习Spring Boot

    之前
    	复杂的配置
    		项目各种配置其实是开发时的损耗
    		写配置挤占了写应用程序逻辑的时间
    	混乱的依赖管理
    		项目当中添加很多库已经很麻烦了
    		还要知道这些库的哪个版本和其他库不会有冲突
    		一旦选错了依赖的版本
    		随之而来的不兼容问题就会造成项目的致命性伤害
    现在
    	Spring Boot 简化了基于Spring的应用开发
    	只需要“run”就能创建一个独立的、生产级别的Spring应用
    	Spring Boot为Spring平台及第三方库提供开箱即用的设置
    

    Spring Boot特点

    • http://spring.io/projects/spring-boot

    • 为所有 Spring 的开发者提供一个非常快速的、广泛接受的入门体验

    • 开箱即用,通过简单的配置,简化了以前复杂配置操作

    • 提供了一些大型项目中常见的非功能性特性,如内嵌服务器、安全、指标,健康检测、外部化配置等

    • 无需 XML 配置

    Spring Boot功能

    • 以jar包方式独立运行(jar -jar xxx.jar)
    • 内嵌Servlet容器(tomcat, jetty),无需以war包形式部署到独立的servlet容器中
    • 提供starter简化maven依赖包配置
    • 自动装配bean(大多数场景)
    • 提倡使用java配置和注解配置结合而无需xml配置

    SpringBoot 快速入门

    从零使用Maven搭建

    1.创建Maven工程
    2.引入springboot依赖
    <parent>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-parent</artifactId>
    	<version>2.1.3.RELEASE</version>
    </parent>
    
    3.添加spring-boot启动器依赖(添加启动器后 web工程常用的依赖会自动帮你引入)
    <dependencies>
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-web</artifactId>
    	</dependency>
    </dependencies>
    
    4.编写启动类
    @SpringBootApplication
    public class Application {
    	public static void main(String[] args) {
    		SpringApplication.run(Application.class,args);
    	}
    }
    
    5.编写Controller直接访问
    @Controller
    public class MyController {
        @RequestMapping("/hello")
        @ResponseBody
        public String hello(){
            return "hello";
        }
    }
    
    6.spring boot 热部署
    <dependency> 
    	<groupId>org.springframework.boot</groupId> 
    	<artifactId>spring-boot-devtools</artifactId>
    </dependency>
    补充
    如遇到spring boot run启动时非常缓慢使用以下方法
    1.在命令行中输入hostname  查询当前主机名称
    DESKTOP-1234567
    
    2.到C盘WindowsSystem32driversetc中找到host文件
    3.复制一份其它地方进行编辑,编辑时在hostname之后添加.local
    # localhost name resolution is handled within DNS itself.
    127.0.0.1       localhost DESKTOP-1234567.local
    ::1             localhost DESKTOP-1234567.local
    	
    4.注意事项: 127.0.0.1和local之间是两个tab 不是空格
    

    父POM依赖管理

    • 所有jar包的版本统一管理
    • 所有jar的依赖管理,其中包含springboot 给我们提供的很多的starter启动器
    • dependencyManage定义了子项目中可能出现的各种依赖及其版本信息;使得子项目在需要的时候引入即可使用,且不再需要定义版本了

    编写配置

    springBoot默认使用servlet3.0 可以没有web.xml
    没有任何的xml,我们想要做一些自定义的配置,比如数据库相关的信息,该如何配置?
    	使用Java配置
    	Spring1.0时代
    		Spring配置都是xml格式
    	Spring2.0时代
    		引入了注解,并未完全替代xml
    	Spring3.0及以后
    		3.0以后Spring的注解已经非常完善了
    	SpringBoot
    		使用Java配置
    SpringBoot进行Java配置
    	springBoot当中java配置主要靠java类和一些注解代替xml
    		@Configuration:声明一个类作为配置类,代替xml文件
    		@Bean:声明在方法上,将方法的返回值加入Bean容器,代替<bean>标签
    		@value:属性注入
    		@PropertySource:指定外部属性文件,
    	创建配置类,引入jdbc.properties
    

    spring boot属性注入

    1.单独放到一个类当中

    1.把properties名称改为application.properties
    2.创建一个类,名为JDBCPropertis
    3.把所有属性添加到类当中
    4.在类上添加注解
    	@ConfigurationProperties(prefix="jdbc")
    	@Data
    	public class JDBCProperties{
    		String url;
    		String driverClassName;
    		String username;
    		String password;
    	}
    
    5.在config中直接使用
    
    	@Configuration
    	@@EnableConfigurationProperties(JDBCProperties.class)
    	public class JdbcConfig{
    		/*方法的返回值就是一个bean对象
    		*就可以使用@autoware进行注入
    		**/
    		@Bean
    		public DataSource dataSource(JDBCProperties jdbc){
    			DruidDataSource dataSource=new DruidDataSource();
    			dataSource.setUrl(jdbc.url);
    			dataSource.setDriverClassName(jdbc.driverClassName):
    			dataSource.setUsername(jdbc.username);
    			dataSource.setPassword(jdbc.password);
    			return dataSource;
    		}
    	}
    	
    6.也可以使用属性注入方式,也可以使用构造方法的形式
    
    	@Configuration
    	@@EnableConfigurationProperties(JDBCProperties.class)
    	public class JdbcConfig{
    		@Autowired
    	JDBCProperties jdbc;
    	public JdbcConfig(JDBCProperties jdbc){
    		this.jdbe=jdbc;
    	}
    		/*方法的返回值就是一个bean对象
    		*就可以使用@autoware进行注入
    		**/
    		@Bean
    		public DataSource dataSource(JDBCProperties jdbc){
    			DruidDataSource dataSource=new DruidDataSource();
    			dataSource.setUrl(jdbc.url);
    			dataSource.setDriverClassName(jdbc.driverClassName):
    			dataSource.setUsername(jdbc.username);
    			dataSource.setPassword(jdbc.password);
    			return dataSource;
    		}
    	}
    

    2.直接注入

    • 创建application.properties属性文件

      jdbc.driverClassName=com.mysql.jdbc.Driver
      jdbc.ur1=jdbc:mysq1://localhost:3306/springboot?characterEncoding=utf-8
      jdbc.username=root
      jdbc.password=123456
      
    • 直接在方法上配置注解形式

    @Configuration
    public class JdbcConfig{
    	/*
    	本声明要注入的属性前缀,
    	SpringBoot会自动把相关解性通过set方法注入到DataSource中
    	*/
    	@Bean
    	@ConfigurationProperties(prefix="jdbc")
    	public DataSource dataSource(){
    		DruidDataSource dataSource=new DruidDataSource();
    		return dataSource;
    	}
    }
    

    3.属性文件使用yaml文件方式

    • 配置文件除了使用application.properties类型,还可以是后缀名为:.yml或.yaml的类型
    • 也会自动的加载
    • YAML是一种简洁的非标记语言,是以数据为中心, 使用空白缩进,分行组织数据,
    • 从而使得表示更加简洁易读

    示例

    
    spring:
      mvc:
        servlet:
          load-on-startup: 1
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
        username: root
        password: 123456
      thymeleaf:
        cache: false
        mode: HTML5
        encoding: UTF-8
      user:
        name:le
        age:21
        language:
          -java
          -python
    
    @Data
    public class JDBCProperties{
        String url;
        String driverClassName;
        String username;
        String password;
        User user;
        class User {
            String name;
            String age;
            List<String> language;
        }
    }
    

    注意事项

    • 如果有两个配置文件一个.properties和一个.yml,会取两个并集
    • 如果有相同的名称,会以properties为主

    自动配置

    使用SpringBoot之后,一个整合了SpringMVC的WEB工程开发非常简单,那些繁杂的配置都消失不见了,这是如何做到的?
    

    1.查看main方法的启动类

    • 注解:@SpringBootApplication
    • run方法:SpringApplication.run()
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class,args);
        }
    }
    

    2.@SpringBootApplication

    查看@SpringBootApplication源码

    在源码当中有3个比较重点的注解

    @SpringBootConfiguration查看源码
    • @SpringBootConfiguration注解是来声明当前类是SpringBoot应用的配置类,项目中只能有一个。所以一般我们无需自己添加。

    • 在这个@SpringBootConfiguration注解上面,又有一个@Configuration注解

    • 这个注解的作用就是声明当前类是一个配置类

    • 然后Spring会自动扫描到添加了@Configuration的类

    • 读取其中的配置信息

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Configuration
    public @interface SpringBootConfiguration {
    }
    
    @EnableAutoConfiguration
    • 开启自动配置
    • 告诉SpringBoot基于所添加的依赖,去“猜测”你想要如何配置Spring。
    • 比如我们引入了spring-boot-starter-web,而这个启动器中帮我们添加了tomcat、SpringMVC的依赖
    • 此时自动配置就知道你是要开发一个web应用,所以就帮你完成了web及SpringMVC的默认配置了!
    • SpringBoot内部对大量的第三方库或Spring内部库进行了默认配置
    • 这些配置是否生效,取决于我们是否引入了对应库所需的依赖
    • 如果有那么默认配置就会生效
    • 我们使用SpringBoot构建一个项目,只需要引入所需框架的依赖,配置就可以交给SpringBoot处理了
    @ComponentScan
    • 配置组件扫描的指令
    • 提供了类似与context:component-scan标签的作用
    • 通过basePackageClasses或者basePackages属性来指定要扫描的包。
    • 如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包
    • 而我们的@SpringBootApplication注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其子包。因此,一般启动类会放在一个比较前的包目录中。

    自动配置原理

    • @EnableAutoConfiguration会开启SpringBoot的自动配置
    • 并且根据你引入的依赖来生效对应的默认配置
    • 问题
      • 为何依赖引入就会触发配置?
      • 这些默认配置是在哪里定义的?

    搭建SSM应用

    准备工作

    1.创建表
    CREATE TABLE `tb_hero` (
    	`id` int(11) NOT NULL AUTO_INCREMENT,
    	`username` varchar(255) DEFAULT NULL,
    	`profession` varchar(255) DEFAULT NULL,
    	`phone` varchar(255) DEFAULT NULL,
    	`email` varchar(255) DEFAULT NULL,
    	PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
    
    INSERT INTO `tb_hero` VALUES ('1', '鲁班', '射手', '13499887733', '12341241@qq.com');
    INSERT INTO `tb_hero` VALUES ('2', '李白', '刺客', '18977665521', 'libai@163.com');
    INSERT INTO `tb_hero` VALUES ('3', '阿轲', '刺客', '18977665997', 'aike@qq.com');
    INSERT INTO `tb_hero` VALUES ('4', '德玛', '肉盾', '13700997665', 'demaxiya.126.com6');
    INSERT INTO `tb_hero` VALUES ('5', '亚索', '战士', '13586878987', 'yasuo@qq.com');
    INSERT INTO `tb_hero` VALUES ('6', '奶妈', '辅助', '13398909089', 'nama@qq.com');
    INSERT INTO `tb_hero` VALUES ('7', '剑圣', '刺客', '13398909088', 'jiansheng@163.com');
    INSERT INTO `tb_hero` VALUES ('8', '盖伦', '肉盾', '15923242231', 'gailun@126.com');
    INSERT INTO `tb_hero` VALUES ('9', '锤石', '辅助', '13398908900', '8888@163.com');
    INSERT INTO `tb_hero` VALUES ('10', '阿木', '辅助', '13398908928', '13398908928@qq.com');
    
    2.表对应的pojo
    public class Hero {
    	private Integer id;
    	private String username;
    	private String profession;
    	private String phone;
    	private String email;
    }
    

    配置spring-mvc(在application.yml文件中配置)

    1.端口配置
    	server:
    		port: 80
    
    2.静态资源访问
    	由于没有了web-inf目录,如果直接把静态资源类似图片等信息放到resource是无法访问到的
    	默认情况下,它是在以下目录当中进行查找静态资源文件
    	private static final String[] CLASSPATH_RESOURCE_LOCATIONS={
    		"classpath:/META-INF/resources/","classpath:/resources/",
    		"classpath:/static/","classpath:/public/"
    	};
    	所以要自己手动在resource文件当中创建静态资源目录
    	
    3.日志级别
        @Slf4j等效于private  static final Logger log = LoggerFactory.getLogger(MyInterceptor.class);
        Slf4j
            log.info("信息")
        日志级别配置
    	logging:
    	  level:
    	   com.itlike: debug
    		# 日志输出路径
    	  path: "D:/test/test.log"
    	  pattern:
          dateformat: "''"
          
    3.拦截器
    	https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/reference/htmlsingle/#getting-started-cli-example
    	1.自定义拦截器
        @Slf4j
        public class MyInterceptor implements HandlerInterceptor {
        	@Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                log.info("拦截器");
                return true;
            }
        }	
    
        2.添加配置
        @Configuration
        public class WebMvcConfig implements WebMvcConfigurer {
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
            }
        }
        
    注解扫描-自动配置完成
    包扫描-内部自带了包扫描
    视图解析器-springboot当中不支持jsp,无需配置
    

    配置JDBC

    1.添加jdbc启动器
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    
    2.添加Mysql数据库驱动
    <dependency>
    	<groupId>mysql</groupId>
    	<artifactId>mysql-connector-java</artifactId>
    </dependency>
    
    3.配置连接参数(在application.yml文件中配置)
    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
        username: root
        password: 123456
    	
    4.添加Mybatis启动器
    spring-boot没有给Mybatis写启动器,Mybaits自己写了启动器
    	https://github.com/mybatis/spring-boot-starter
    添加Mybatis启动器
    <dependency>
    	<groupId>org.mybatis.spring.boot</groupId>
    	<artifactId>mybatis-spring-boot-starter</artifactId>
    	<version>1.3.2</version>
    </dependency>
    别名
    	type-aliases-package: com.itlike.Pojo
    配置mapper文件地址
    	mapper-locations: mapper/*.xml
    mapper接口扫描
    	在main方法上添加@MapperScan("包名") 注解
    	
    map
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="">
    
    </mapper>
    

    通用Mapper

    介绍
    	https://github.com/abel533/Mapper
    	通用Mapper可以极大的方便开发人员
        可以随意的按照自己的需要选择通用方法
        还可以很方便的开发自己的通用方法
        极其方便的使用MyBatis单表的增删改查
    	支持单表操作,不支持通用的多表联合查询。
    	
    1.引入启动器
    <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper-spring-boot-starter</artifactId>
        <version>2.1.5</version>
    </dependency>
    
    2.使用时, 直接在接口上继续Mapper<实体类>
    public interface HeroMapper extends Mapper<Hero> {
        public List<Hero> getAllHero();
    }
    
    以前需要自己写方法, 现在不用自己写,直接继承
    也不需要在Mapper文件当中写sql了
    底层会利用Mybatis的可拦截原理,帮你把方法的sql动态生成了
    通用mapper已经引入了springboot jdbc Mybatis,就不需要再单独引入了
    也可开启驼峰
    启动类也可改成通用mapper的启动类,通过mapper在扫描时, 去自动生成sql
    
    3.在Pojo中指定表名与相关主键属性
    @Data
    @Table(name = "tb_hero")
    public class Hero {
        @Id
        @KeySql(useGeneratedKeys = true)
        private Integer id;
        private String username;
        private String profession;
        @Transient
        private String phone;
        private String email;
        private Date onlinetime;
    }
    

    创建Service并调用执行

    //添加service方法
    //在添加Spring-jdbc时, 所有的事务都已经配置完成 , 无需我们再自动配置事务
    //只需要在添加事务的方法上, 添加注解@Transactional
    @Service
    public class HeroServiceImpl implements HeroService {
    
        @Autowired
        private HeroMapper heroMapper;
    
        @Override
        public List<Hero> getAllHero() {
            List<Hero> heroes = heroMapper.selectAll();
            System.out.println(heroes);
            return heroMapper.getAllHero();
        }
    }
    

    web层调用执行

    @Controller
    @Slf4j
    public class MyController {
        @Autowired
        private HeroService heroService;
        @RequestMapping("/hello")
        public String hello(Model model){
            List<Hero> allHero = heroService.getAllHero();
            model.addAttribute("allHero",allHero);
            return "hello";
        }
    }
    
  • 相关阅读:
    BZOJ 1021 循环的债务
    BZOJ 1019 汉诺塔
    BZOJ 1018 堵塞的交通
    BZOJ 1017 魔兽地图
    BZOJ 1016 最小生成树计数
    Luogu 3008 [USACO11JAN]道路和飞机Roads and Planes
    Luogu 3625 [APIO2009]采油区域
    Luogu 4139 上帝与集合的正确用法
    Luogu 3629 [APIO2010]巡逻
    Luogu 3626 [APIO2009]会议中心
  • 原文地址:https://www.cnblogs.com/mumuyinxin/p/11316846.html
Copyright © 2011-2022 走看看