springBoot

什么是SpringBoot?

springBoot就是用来简化Spring应用的初始搭建以及开发过程,让开发者不需要经过繁琐的配置就可以进行开发,可以将尽力关注与、于业务逻辑的框架。从根本上来讲,Spring Boot就是一些库的集合,它能够被任意项目的构建系统所使用。springBoot并不是一个全新的框架,他不是spring解决方案的一个替代品,而是spring的一个封装。所以,以前可以用spring做的事,springBoot都可以做。springBoot是一个非常好的微服务开发框架。

注解
Springboot中常用的注解
1.@RestController

它继承自@Controller注解,当实现一个Restful web services的时候,response将一直通过response body发送。

2.@RequestMapping

它是一个用来处理请求地址映射的注解,可以用于类上,表示类中的所有的响应请求的方法都是以该地址作为父路径。该注解有六个属性:

  1. params:指定request中必须包含某些参数值时,才让该方法处理。
  2. header:指定request中必须包含某些指定的header值,才能让该方法处理请求。
  3. value:指定请求的实际地址,指定的地址可以是URL Template模式。
  4. method:指定请求的method类型,GET/POST/PUT/DELETE。
  5. consumes:指定处理请求的提交内容类型(Content-Type),如application/json,text/html。
  6. produce:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含了该指定类型才返回

详细用例如下所示:

@RequestMapping(value = "test")
@RestController
public class TestController {

    //测试springBoot项目启动
   @RequestMapping(value = "hello")
    public String Test(){
        return "你好啊!!!";
    }
}

启动项目,一般默认端口号为8080,访问localhost(172.0.0.1):8080/test/hello结果如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mR8njNs0-1645511151234)(C:\Users\viruser.v-desktop\AppData\Roaming\Typora\typora-user-images\image-20220222095512638.png)]

3.@ResponseBody

它表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常被解析为跳转路径,加上@ResponseBody后,会直接返回json数据。

4.@RequestBody

它将HTTP请求正文插入方法中,使用适合的HttpMessageConverter将请求体写入某个对象。

5.@Service

它一般用于修饰Service层的组件。

6.@Data

它用于实体类中get和set的方法的创建,用了它,就不用实现get和set方法了。

7.@Component

它泛指组件,当组件不好归类的时候,可以使用这个注解进行标注。放在类上,把普通类实例化到spring容器中。可以说很多注解都是基于这个注解的。

8.@RequestParam

用在方法前面的参数。

9.@Transactional

在spring容器中,我们手工注解@Bean将被优先加载,框架不会重新实例化其他的PlaformTransactionManager实现类。在Sercice中,被@Transactional注解的方法,将支持事务。如果注解在类上,则整个的所有方法都默认支持事务。

10.@Bean

用在方法上,用@Bean标注方法等价于xml中配置bean,这个方法一般返回一个实体对象,告诉spring这里产生一个对象,然后这个对象会交给spring管理。产生这个对象的方法Spring只会调用一次,随后这个spring将会将这个Bean对象放在自己的容器中。

11.@Configuration

标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。(靠@Component注解)。

12.@ConfigurationProperties

将配置文件的参数映射成一个对象,通过prefix来设定前缀,然后将后面的和对象的属性名一直就能实现注入(当然这个对象需要注入的属性需要提供get和set方法,因为spring底层其实就是通过反射调用该对象的set方法)。

13.@value

value的作用其实和ConfigurationProperties的作用差不多,就是读取的配置文件中参数的值,但是value是放在变量上面的,且是单值读取,而且value标注的变量并不需要和配置的文件的参数名字一致。

14.@Resource

按名称来注入的,当找不到与名称匹配的Bean才会按照类型来注入。其实平时用的都是它默认的方式,即都不指定名字和类型。spring通过反射机制使用byName方法自动注入。@Resource的装配顺序:

  1. 如果同时指定了name属性和type属性,那么spring将从容器中找唯一匹配的bean进行装配,找不到则抛出异常。
  2. 如果指定了name属性值,则从容器中查找名称匹配的Bean进行装配,找不到则抛出异常。
  3. 如果指定了type属性值,则从容器中查找类型匹配唯一的Bean进行装配,找不到或者找到多个都会抛出异常。
  4. 如果都不指定,则会自动按照ByName方式进行装配
15.@Autowired

它一般结合@ComponnetScan注解,来自动注入一个Service或Dao级别的Bean。默认是按照类型进行装配注入,如果允许null值,可以设置他required为false。即当不能确定Spring容器中一定拥有某个类的Bean时,可以在需要自动注入该类Bean的地方使用@Autowired(required = false)。

16.@Qualifier

@Autowired是根据类型进行自动装配的。如果当spring上下文中存在不只一个或存在多个该类型的Bean时,就会抛出一个BeanCreateException异常。针对存在多个该类型的Bean,可以联合使用@Qualifier和@Autowired。

@Autowired
@Qualifier("User")
Private Usre user;
17.@SpringBootApplication

这个注解就是集成了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan这三个注解。其中@SpringBootConfiguration表示这个类为配置类,@EnableAutoConfiguration表示开启自动配置,@ComponentScan表示自动扫描,只能扫描同一级的目录。

18.@EnableAutoConfigurationProperties

将带有@ConfigurationProperties注解的类注入为Spring容器的Bean。如果使用了@ConfigurationProperties但是没有在启动类上增加这个注解,则@ConfigurationProperties将不起作用。

19.@Async与@EnableAsync

其中@Async表示这个方法是异步方法;@EnableAsync这个注解需要加在启动类上,表示支持异步操作;如果不加,则@Async将不起作用。通俗点可以将这个注解理解为另起了一个线程。

20.@Scheduled与@EnableScheduled

定时任务。同样,@EnableScheduled这个注解也需要加在启动类上,表示支持定时任务。

21.@Primary

在spring中使用注解,常使用@Autowired,默认是根据类型Type来自动注入的。但有些特殊的情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取一种情况下@Primary的作用就起来了。当然也可以活用注解,个人原因是遇到了双数据源(mysql+clickhouse)是需要配置一个默认数据源时使用,样例如下:
application.yml配置数据

spring:
  datasource:
  	druid:
  	#Mysql
  	username: root
  	password: ****
  	url: jbbc:mysql://***/**?useUnicode=true$characterEncoding=utf-8&userSSL=true&serverTimezone=UTC
  	type: com.alibaba.pool.DruidDataSource
  	driverClassName: com.mysql.jdbc.Driver
  	#ClickHouse
  	click:
  	  dirverClassName: ru.yandex.clickhouse.ClickHouseDriver
  	  url: jdbc:clickhouse://***/**
  	  username: ****
  	  password: ****
  	  initialSize: 10
  	  maxActive: 100
  	  minIdle: 10
  	  maxWait: 6000
  	  

mysqlJdbcParamConfig配置如下:

//通过@ConfigurationProperties获取application.yml中的配置信息
@Data 
@Componet
@ConfigurationProperties(prefix = "spring.datasource")
public class MysqlJdbcParamConfig{
    private String driverClassName;
    private String url;
    private String username;
    private String password;
}

//将上面的对象在容器中配置起来
@Configuration
@MapperScan(basePackages = "上面对象的路径")
public class MysqlDuridConfig{
    
    @Autowired
    MysqlJdbcParamConfig mysqlJdbcParamConfig;
    
   @Bean("mysqlDataSource")
    @Primary
    public DataSource mysqlDataSource(){
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(mysqlJdbcParamConfig.getUrl());
        datasource.setDriverClassName(mysqlJdbcParamConfig.getDriverClassName());
        datasource.setUsername(mysqlJdbcParamConfig.getUsername());
        datasource.setPassword(mysqlJdbcParamConfig.getPassword());
        return datasource;
    }
    @Bean("mysqlTransactionManager")
    @Primary
    public DataSourceTransactionManager getDataSourceTransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }
    @Bean("sqlSessionFactory")
    @Primary
    public SqlSessionFactory getSqlSessionManager(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }
}

clickJdbcParamConfig配置如下:

//通过@ConfigurationProperties获取application.yml中的配置信息
@Data
@Component

@ConfigurationProperties(prefix = "spring.datasource.click")
public class ClickHouseJdbcParamConfig {
    private String driverClassName;
    private String url;
    private String username;
    private String password;
    private Integer initialSize;
    private Integer maxActive;
    private Integer minIdle;
    private Integer maxWait;
    }

//将上面的对象在容器中配置起来
@Configuration
@ConfigurationProperties
@MapperScan(basePackages = "com.hexin.clickhouseDemo.clickDao", sqlSessionFactoryRef = "clickHouseSqlSessionFactory")
public class ClickHouseDruidCongfig {


    @Autowired
    ClickHouseJdbcParamConfig clickHouseJdbcParamConfig;

    @Bean("clickDataSource")
    public DataSource dataSource(){
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(clickHouseJdbcParamConfig.getUrl());
        datasource.setDriverClassName(clickHouseJdbcParamConfig.getDriverClassName());
        datasource.setUsername(clickHouseJdbcParamConfig.getUsername());
        datasource.setInitialSize(clickHouseJdbcParamConfig.getInitialSize());
        datasource.setMinIdle(clickHouseJdbcParamConfig.getMinIdle());
        datasource.setMaxActive(clickHouseJdbcParamConfig.getMaxActive());
        datasource.setMaxWait(clickHouseJdbcParamConfig.getMaxWait());
        datasource.setPassword(clickHouseJdbcParamConfig.getPassword());
        return datasource;
    }
    @Bean("clickTransactionManager")
    public DataSourceTransactionManager getDataSourceTransactionManager(@Qualifier("clickDataSource") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean("clickHouseSqlSessionFactory")
    public SqlSessionFactory getSqlSessionManager(@Qualifier("clickDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐