springBoot
什么是SpringBoot?
springBoot就是用来简化Spring应用的初始搭建以及开发过程,让开发者不需要经过繁琐的配置就可以进行开发,可以将尽力关注与、于业务逻辑的框架。从根本上来讲,Spring Boot就是一些库的集合,它能够被任意项目的构建系统所使用。springBoot并不是一个全新的框架,他不是spring解决方案的一个替代品,而是spring的一个封装。所以,以前可以用spring做的事,springBoot都可以做。springBoot是一个非常好的微服务开发框架。
注解
Springboot中常用的注解
1.@RestController
它继承自@Controller注解,当实现一个Restful web services的时候,response将一直通过response body发送。
2.@RequestMapping
它是一个用来处理请求地址映射的注解,可以用于类上,表示类中的所有的响应请求的方法都是以该地址作为父路径。该注解有六个属性:
- params:指定request中必须包含某些参数值时,才让该方法处理。
- header:指定request中必须包含某些指定的header值,才能让该方法处理请求。
- value:指定请求的实际地址,指定的地址可以是URL Template模式。
- method:指定请求的method类型,GET/POST/PUT/DELETE。
- consumes:指定处理请求的提交内容类型(Content-Type),如application/json,text/html。
- produce:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含了该指定类型才返回
详细用例如下所示:
@RequestMapping(value = "test")
@RestController
public class TestController {
@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的装配顺序:
- 如果同时指定了name属性和type属性,那么spring将从容器中找唯一匹配的bean进行装配,找不到则抛出异常。
- 如果指定了name属性值,则从容器中查找名称匹配的Bean进行装配,找不到则抛出异常。
- 如果指定了type属性值,则从容器中查找类型匹配唯一的Bean进行装配,找不到或者找到多个都会抛出异常。
- 如果都不指定,则会自动按照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:
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
click:
dirverClassName: ru.yandex.clickhouse.ClickHouseDriver
url: jdbc:clickhouse://***/**
username: ****
password: ****
initialSize: 10
maxActive: 100
minIdle: 10
maxWait: 6000
mysqlJdbcParamConfig配置如下:
@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配置如下:
@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();
}
}
|