SpringBoot(浅显使用不涉及原理)

一、SpringBoot的重磅性

A、微服务环境下的涅槃重生

  • 在原来的项目中,Spring家族这种配置加容器的设计,到还可以忍受,因为配置只需要写一遍。但是当微服务兴起之后,同样的配置,要在不同的服务端重复写,就导致工作量大大增大:
  • 这时候SpringBoot诞生!他是spring家族项目的快速启动器,其只需要写少量配置文件,甚至不用写配置文件就可以搭建起一个项目。解决了配置地狱的难题;

B、SpringBoot都有哪些优点

  • 约定大于配置。就是说当有些必要的配置选项springboot都会给默认的初始值(这个初始值是根据编程经验来定);比如你项目在服务器中的路径,默认为/,dispatcher默认拦截路径也为/,还约定在主程序包或其子包下的组件注解都会被自动扫描,省了扫描配置。
  • 场景的嵌入:不需要配置服务器,自带tomcat服务器,同时还有各种安全监控等场景引入
  • 开箱即用!
  • 还有很多优点,一个字,赞!

二、建立一个快速启动的项目:

A、首先要创建一个空的普通的空的java项目,起结构作用

SpringBoot(浅显使用不涉及原理)_第1张图片

B、创建一个maven项目,使其父工程为spring-boot-starter-parent(项目名为springboot-one)


    org.springframework.boot
    spring-boot-starter-parent
    3.1.2

 C、引入web的场景启动器,其一引入所有web需要的依赖都会被引入


        org.springframework.boot
        spring-boot-starter-web
        3.1.0
    

D、创建程序的入口,主类

@SpringBootApplication//表明是SpringBoot的类
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class,args);//自动加载ioc容器,和启动tomcat
    }
}

E、在主类所在的包下创建Controller包(约定主类所在包或其子包下的组件注解都会被扫描,注册到容器)

@RestController
public class TestController {
    @GetMapping("hello/springboot")
    public String hello(){
        return "你好,Spingboot";
    }
}

如此就ok了!

三、统一的配置文件管理

(一)单文件的配置管理

A、不是说不需要配置吗?

  • 所谓不需要是指一些通过设置默认值的方式可以解决的配置,都做了默认值,但是当有用户名和密码的等个性化的配置信息时,以及当你不需要默认配置给定的值时,都可以通过配置文件自定义,当有自定义值时,默认值就会失效。

B、是所有的配置都在一个配置文件中吗?

  • 对,所有配置文件都在一个文件中,不同模块的配置通过层级化的key值来区分
  • 配置中的配置可以是官方指定配置也可以存放自己需要的配置,配置完不需要什么@Property等等注解,直接在要接收的属性上使用@Value注解即可。

C、配置文件所有的官方配置都放在官网地址:Common Application Properties

 D、配置文件的例子

  • 配置文件放在resource下,命名必须为application.properties或者application.xml

xml

#设置项目的跟路径名称,默认值为“/”,注意配置文件字符串不用加“”,同时等号不用前后空格,没要求
server.servlet.context-path=/myProject
#自定义的配置文件
my.name=ChenPei
my.lover=beauty

yaml(yml) 

#设置项目的跟路径名称,默认值为“/”,注意配置文件字符串不用加“”,同时等号不用前后空格,没要求
#注意数据冒号跟值要空格,否则无法识别
server:
  servlet:
    context-path: /myProject
my:
  name: ChenPei
  lover: beauty
  • 自定义配置的引用:
@Value("${my.name}")
    String myName;
  • 当配置文件对应接收的是对象的时候,就可以直接在对象类上使用@ConfigurationProperties注解

接收的类:使用类在类上标注解的方式也可以接受集合数据

@Repository//注入到容器自动接收的基础
@ConfigurationProperties("my")//写到类对应属性之前的结构
public class User {
    String name;
    String lover;
//省略了必要的setter和getter方法
}

(二)多文件的配置管理

A、为什么要是用多文件来来管理配置文件?一个不是挺好吗?

  • 一个配置文件固然方便,但是有时我们需要给配置文件分类时多文件更便于分类。
  • 比如:开发测试场景和正式上线的配置不同,如果放在一个配置文件中就会很难找到头绪
  • 再比如:有些配置类是数据库的,虽然有了多层级的key来唯一区分了,但是也可以分成不同类型在不同的配置文件存放。更加清晰。

B、那么我们应该如何指定多个配置文件?

  • 多个配置文件命名的固定格式:application-自定义名称.xml or application-自定义名称.yml
  • 同时要在application.xml中通过配置指定要加载的其他多个文件,中间用逗号隔开:
#指定要加载的其他配置文件,active后直接跟名称后缀
spring:
  profiles:
    active: test #我有个叫application.yml的配置文件
  • 指定要加载的配置文件也可以在项目运行时指定(后续内容) 

四、静态资源的访问

A、直接将静态资源放在约定的文件夹下即可被访问:

  • 约定的放静态资源的文件如下(都在resource下)
  1. static
  2. META-INF/resources
  3. public
  4. resources

B、也可以自己指定自己的静态资源存放文件夹

spring:
  #指定要加载的其他配置文件,active后直接跟名称后缀
  web:
    resources:
      static-locations: classpath:/mystatics/mystatic

 C、静态资源调用是要将指定为静态资源路径省略,才能够调到

比如上面A情况,我调用就是http:地址:端口/项目路径/静态资源

直接就越过了指定的静态资源文件路径

五、springboot整合druid数据源

  • 我们使用springboot3,相比于springboot2,配置文件的加载方式发生了改变,而druid数据库到现在为止仍人没有做适配,所以就需要我们手动进行自动配置类的注入

A、首先引入需要的依赖:

 
     
      org.springframework.boot  
      spring-boot-starter-web 
    
    

      org.springframework.boot
      spring-boot-starter-jdbc
    
    

      com.mysql
      mysql-connector-j
        8.0.32
    
    

        com.alibaba
        druid-spring-boot-3-starter
        1.2.18
    
   

设置数据源必须的一些配置:

server:
  servlet:
    context-path: /myProject

#指定使用的数据源.
my:
  name: ChenPei
  lover: beauty
#指定使用的数据源类型
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      #指定数据源必须的四大要素:
      username: root
      url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8
      password: chen13515216766
      driver-class-name: com.mysql.cj.jdbc.Driver
#下面的数据源配置配置可选
# 初始化时建立物理连接的个数
      initial-size: 5
      # 连接池的最小空闲数量
      min-idle: 5
      # 连接池最大连接数量
      max-active: 20
      # 获取连接时最大等待时间,单位毫秒
      max-wait: 60000
      # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
      test-while-idle: true
      # 既作为检测的间隔时间又作为testWhileIdel执行的依据
      time-between-eviction-runs-millis: 60000
      # 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接(配置连接在池中的最小生存时间)
      min-evictable-idle-time-millis: 30000
      # 用来检测数据库连接是否有效的sql 必须是一个查询语句(oracle中为 select 1 from dual)
      validation-query: select 1
      # 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      test-on-borrow: false
      # 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true
      test-on-return: false
      # 是否缓存preparedStatement, 也就是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭。
      pool-prepared-statements: false
      # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
      max-pool-prepared-statement-per-connection-size: -1
      # 合并多个DruidDataSource的监控数据
      use-global-data-source-stat: true

设置主启动类后(省略),创建controller类

@RestController
public class EmployeeController {
    //注入jdbcTemplate
    @Autowired
    JdbcTemplate jdbcTemplate;
    //查找employees的映射
    @GetMapping("getEmployees")
    public List getEmployees(){
        String sql = "select eid,emp_name empName,emp_sex empSex,emp_age empAge,emp_email empEmail" +
                ",did from t_emp";
        List employees = jdbcTemplate.query(sql, new BeanPropertyRowMapper(Employee.class));
        System.out.println(employees);
        return employees;
    }
}

最后修复druid对springboot3的支持:

在resource文件夹下创建文件夹META-INF/spring然后在该文件夹下创建文件:org.springframework.boot.autoconfigure.AutoConfiguration.imports,然后输入一下内容

com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure

六、用mybatis代替jdbcTemplate

首先添加依赖:


          
          org.mybatis.spring.boot
          mybatis-spring-boot-starter
          3.0.2
      

然后在application.yml中使用约定的配置指定mybatis的映射文件路径等关键配置:

mybatis:
  mapper-locations: classpath:/mappers/*.xml  #指定映射文件位置
  configuration:
    map-underscore-to-camel-case: true #开启驼峰自动映射

再创建mapper接口和xml映射文件

@Mapper//标注此注解会被自动扫描
public interface EmployeeMapper {
    //获取employees集合
    List getEmployees();
}





    

最关键要再主类上加上@MapperScan注解并在value中指定mapper接口所在包,这样就告诉了主类将指定包下面的mapper接口放入容器创建代理。

@SpringBootApplication//表明是SpringBoot的类
@MapperScan("com.chenpei.springboot.mappers")//让spring注解扫描到Mapper注解标注的类
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class,args);//自动加载ioc容器,和启动tomcat
    }
}

七、springboot方便的aop和tx使用

(一)使用aop

引入aop场景启动器:



          org.springframework.boot
          spring-boot-starter-aop
      

自定义类标注为aop增强类,注入容器就可以使用了:

@Aspect //标注为aop强化类
@Order(0)//为该强化类设置优先级
@Component//放入容器
public class MyAop {
    //标注前置通知
    @Before("execution(* com.chenpei.springboot.controller.EmployeeController.getEmployees(..))")
    public void beforeMe(){
        System.out.println("前置通知执行了!");
    }
}

(二)使用tx(事务)

引入jdbc场景启动器,里面包含了tx



      org.springframework.boot
      spring-boot-starter-jdbc
    

在其中有dml(使数据库数据变化的语句)逻辑的方法或类上加上@Transactional,就直接开启了事务:


    @Transactional //开启事务
    @GetMapping("getEmployees")
    public List getEmployees(){
        List employees = employeeMapper.getEmployees();
        return employees;
    }

B、SpringBoot项目的打包和部署

  • 因为springboot自带了服务器,所以直接打成jar包放到服务器或本地即可运行。
  • 首先引入插件springboot打包插件:(设置打包方式为jar)
  • 如果不引入该插件会包缺少主清单文件的错误
 
        
            
                
                org.springframework.boot
                spring-boot-maven-plugin
                3.1.2
            
        
    
  • 然后执行maven的package命令 mvn package,执行完毕后会生成一个jar文件,直接在本地服务器执行java -jar [添加的配置][添加的配置]...   jar包名  命令即可开启该项目

打包后的文件名:

放到本地运行:

这里我们尝试在本次执行时修改项目路径为/youProject,通过-D指定要增加或修改的参数

java -jar -Dserver.servlet.context-path=/youProject /Users/chenpei/Downloads/springboot-one-1.0-SNAPSHOT.jar

 所有配置文件都可在其中指定一个-D指定一个配置项。

你可能感兴趣的:(spring,boot,后端,java)