Spring Boot学习笔记

本文详细介绍了Spring Boot的学习笔记,涵盖了启动类、控制器、实体类、映射器、配置类、测试类等方面,涉及注解使用、数据绑定、缓存管理、RabbitMQ消息及Feign接口等内容,旨在深入理解Spring Boot的开发实践。
摘要由CSDN通过智能技术生成

typora-root-url: E:\Documents\typora-user-images


一、SpringBootApplication(启动类):


@SpringCloudApplication

确定该类为启动类。

相当于@SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan(“com.sunyard”)。

@MapperScan(value = "com.atguigu.springboot.mapper")

指定某个包为mapper包,相当于给每个接口自动加上@Mapper。

@EnableCaching

开启基于注解的缓存。

@ComponentScan("com.sunyard")

注解在启动类上,设置IOC容器要扫描的包。

@EnableDiscoveryClient

用于SpringCloud,标注在启动类上,让注册中心能够发现,扫描到该服务。

二、Controller(控制器类):


1、常用:

@RestController

@RestController注解相当于**@ResponseBody + @Controller**合在一起,@ResponseBody可以将控制器返回的对象、列表转为json串。

@SessionAttributes(names = {"id"}, types = {Role.class})

在控制器中可以使用注解@SessionAttributes来设置对应的键值对,不过这个注解只能对类进行标注,不能对方法或参数注解。它可以配置属性名称或者属性类型。它的作用是当这个类被注解后,Spring MVC执行完控制器的逻辑后,将数据模型中对应的属性名称或者属性类型保存到HTTP的Session对象中

2、接收参数:

@Valid

使用 @Valid 标注,表明这个Bean将会被检验是否符合注解验证

@RequestParam(value = "date", required = false, defaultValue="")

将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)

语法:

value:参数名

required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。

defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值

@RequestAttribute

注解@RequestAttribute被用于访问由过滤器或拦截器创建的、预先存在的请求属性。

@RequestAttribute和@RequestParam注解的区别:

@RequestAttribute注解的参数在项目里是自己解析出来的,并不是前端传递的。具体一点,在项目里的拦截器里会对Token信息进行解析,解析出来的参数重新放在请求里(用httpServletRequest.setAttribute(name, value)),后边接口接收参数时就用这个注解。

@RequestParam注解则表示这个参数是通过前端传递过来的,如果请求里没有这个参数,则会报错400 Bad Request。

@RequestPart

@RequestPart主要用来处理content-type为 multipart/form-data 或 multipart/mixed stream 发起的请求,可以获取请求中的参数,包括普通文本、文件或复杂对象比如json、xml等,针对json等复杂对象,需要明确对应的content-type:multipart/form-data。

multipart/form-data是基于post方法来传递数据的,并且其请求内容格式为Content-Type: multipart/form-data,form-data格式一般是用来进行文件上传的。使用表单上传文件时,必须让表单的 enctype 等于 multipart/form-data,因为该值默认值为application/x-www-form-urlencoded

关于multipart/form-data具体可参考:https://www.cnblogs.com/xiaocaiyuxiaoniao/p/9430878.html

@SessionAttribute("userName")

将请求参数绑定到你控制器的方法参数上(用于获取Session中的数据)。

设置session参数使用@SessionAttributes注解。

@GetMapping("/car/{id}")
public void getCar(@PathVariable("id") Integer id){
    
}

@PathVariable(“id”)用于将请求参数绑定到你控制器的方法参数上(用于获取url中的数据)。

@MatrixVariable("low")

用于获取矩阵变量的值。

不同于常规的http://xxxx/video/BV1Et411Y7tQ?p=142&a=666,传递矩阵变量的格式为http://xxxx/video/BV1Et411Y7tQ;p=142;a=666,777,888,其中每一个分号代表一个属性,逗号则代表一个属性有多个值,需要使用列表来接收。

SpringBoot默认禁用了矩阵变量的功能,需要手动开启。

@RequestBody

将请求参数绑定到你控制器的方法参数上(用于将前端传过来的json转换为对应的对象或者数组),只能使用POST方式进行提交。

@RequestHeader(value="User-Agent", required=false, defaultValue="attribute")

HTTP请求头获取对应的请求信息。

@CookieValue(value="JSESSIONID", required=true, defaultValue="MyJsessionId")

Cookie请求头获取对应的请求信息。

三、Entity(实体类):


1、Lombok:

@Data

使用这个注解可以省去代码中get()、 set()、 toString()、@EqualsAndHashCode、@RequiredArgsConstructor等方法

使用这个注解需要在IDEA中安装lombok插件,并且在pom.xml中添加lombok依赖:

<!--lombok-->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.16</version>
			<scope>provided</scope>
		</dependency>
@RequiredArgsConstructor(staticName="of")

会生成一个包含常量,和标识了NotNull的变量 的构造方法。生成的构造方法是private,如何想要对外提供使用可以使用staticName选项生成一个static方法。

意味着这个类不能用构造方法构造出来,必须通过 ThisClass.of(…)方法才能构造出来。

如果类里面没有 final 的成员变量,有没有它是一样的,但如果有的话,就会产生一个构造器,要求传入 final 对应的变量的值。然后无参构造器不可用。

@EqualsAndHashCode(callSuper = true)

此注解会生成equals(Object other) 和 hashCode()方法

@AllArgsConstructor

生成全参数构造函数,参数的顺序与属性定义的顺序一致。

同时如果变量使用了NotNull annotation , 会进行是否为空的校验。

@NoArgsConstructor

生成无参构造函数

@Builder(toBuilder=true)

为对象的创建工作提供Builder方法,setter赋值方法私有化,对属性的赋值改为采用Builder的方式:

UserInfo userInfo = UserInfo.builder()
        .name("zzl")
        .email("bgood@sina.com")
        .build();

2、数据库相关:

@TableId(value = "", type = "")

标注在id属性上,指定为主键。

value:指定表中主键列的列名,如果实体属性名与列名一致,可以省略不指定

type:指定主键策略。

@TableName(value = "")

指定实体类对应的数据库表名,需要添加MyBatis-plus依赖:

<!--mybatis_plus-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.4.1</version>
		</dependency>
@TableField(exist = false, fill = INSERT)

exist = false 代表这个属性在表中不存在。

fill = INSERT 代表在插入的时候进行自动填充

3、配置相关:

@ConfigurationProperties(prefix = "person")

将本类中的所有属性和配置文件中person下面的配置进行绑定,默认从全局配置文件中获取,如要从别的配置文件中获取,可以使用**@PropertySource**注解。

prefix为配置文件中的配置前缀,如配置文件中的配置为:person.name = 李,则prefix = “person”,且类中的属性为name,这样才能实现配置绑定。

@PropertySource(value = {"classpath:person.properties"})

@PropertySource标注在类上可以加载指定的配置文件。

@Value("#{dataSource.url}")

为当前属性注入值,@Value的值可以是:字面量 / ${key}从环境变量、配置文件中获取值 / #{SpEL}。

4、注解验证:

注解详细信息
@Null被注释的元素必须为null
@NotBlank这玩意只能作用在接收的String类型上,被注释的元素不能为null,而且调用trim()后,长度必须大于0
@NotEmpty被注释的元素不能为null,而且不能为empty(长度必须大于0),一般用在集合类上面
@NotNull被注释的元素不能为null,但可以为empty,一般用在基本数据类型的非空校验上,而且被其标注的字段可以使用 @size/@Max/@Min对字段数值进行大小的控制
@AssertTrue被注释的元素必须为true
@AssertFalse被注释的元素必须为false
@Min(value)被注释的元素必须为一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须为一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注释的元素必须为一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注释的元素必须为一个数字,其值必须小于等于指定的最大值
@Size(max, min)被注释的元素的大小必须在指定的范围内
@Digits(integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future被注释的元素必须是一个将来的日期
@Pattern(value)被注释的元素必须符合指定的正则表达式

其中@DecimalMax(value)和@Max(value) 的区别在于@DecimalMax(value)可以通过把数字设为字符串来处理非常大的数字,比如@DecimalMax(“9999999999.999999999”),而@Max(value)则不行,它只能设置正常大小的数字@Max(9999)。

5、其他:

@JsonProperty(value="Header")
private CibFundBaseReqHeader Header;

当实体类中的属性名首字母为大写或者第二个字母为大写时,setter和getter方法会出一点问题,Controller接收的Json数据无法set到对象中,加上此注解可以解决。

四、Mapper(映射器):


@Mapper

标注在mapper接口上,添加了@Mapper注解之后这个接口在编译时会生成相应的实现类,如果在启动类上添加了@MapperScan,那么就不需要这个注解了。

@Options(useGeneratedKeys = true, keyProperty = "id")

可以设置多种属性,以上为设置某个属性为自增属性,该注解可加在insert上。

五、Configuration(配置类):


@Configuration(proxyBeanMethods = true)
public class MyMvcConfig extends WebMvcConfigurerAdapter {}

指明当前类是一个配置类;使用WebMvcConfigurerAdapter可以用来扩展SpringMVC的功能。

proxyBeanMethods = true代表当外部注入该组件时,去ioc容器中去找,如果为false则直接新创建一个。

@EnableWebMvc

取消SpringBoot对SpringMVC的默认配置,全面接管SpringMVC。

@Data
@ConfigurationProperties(prefix = "yyzx.properties")
public class AnnotationDesc {
  // 该书写方式,属性值注入成功
}

@Slf4j
@Configuration
@EnableConfigurationProperties({
        AnnotationDesc.class,
        YyzxProperties2.class
})
public class SpringBootPlusConfig {

}

@EnableConfigurationProperties可以使注解了@ConfigurationProperties的类生效。

六、Test(测试类):


@RunWith(SpringRunner.class)

加在测试类上,Junit5就不需要这个了。

@Test

出现org.junit.jupiter.api不存在的错误时,需要添加如下依赖:

<dependency>
	<groupId>org.junit.jupiter</groupId>
	<artifactId>junit-jupiter-api</artifactId>
	<version>5.7.0</version>
	<scope>test</scope>
</dependency>
@SpringBootTest

加在测试类上。

七、通用:

1、向IOC容器添加组件:

@Component("conversionImpl")

把普通pojo实例化到spring容器中,泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。

@Bean

将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名,返回类型就是组件类型。

@Import({User.class, DBHelper.class})
@Controller	//或者@Configuration、@Service等

调用无参构造器给容器中自动创建出指定类型的组件,默认的组件名字就是全类名(com.entity.User),主要用于导入第三方包。

@Conditional
@Bean	//或者@Configuration、@Controller等

条件装配:满足Conditional指定的条件,则进行组件注入。

如@ConditionalOnBean(“Role”)就是当Ioc容器中有Role的时候才进行组件注入。

2、实现依赖注入:

@Autowired

自动注入ioc容器中的对象(by type)。

@Resource

@Resource和@Autowired注解都是用来实现依赖注入的。只是@AutoWried按by type自动注入,而@Resource默认按byName自动注入。

3、自动装配的歧义性:

@Primary
@Controller

优先注入。

@Autowired
@Qualifier("roleService3")
private RoleService roleService = null;

按名称查找。

4、工具类

@Scope("prototype")

用于设定某一个注入类(Controller、Service、Bean、Component)的使用范围,可以设置4个值。

他们的含义是:

  • singleton和prototype分别代表单例和多例;
  • request表示请求,即在一次http请求中,被注解的Bean都是同一个Bean,不同的请求是不同的Bean;
  • session表示会话,即在同一个会话中,被注解的Bean都是使用的同一个Bean,不同的会话使用不同的Bean。
@Slf4j

如果不想每次都写private final Logger log = LoggerFactory.getLogger(当前类名.class); 可以用注解@Slf4j。

log用于输出日志。

@ImportResource(locations = {"classpath:beans.xml"})

Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;该注解用于导入Spring的配置文件,让配置文件里面的内容生效(SpringBoot推荐给容器中添加组件的方式:推荐使用全注解的方式)。

@Scheduled(cron = "0 0 * * * ?")

实现定时任务。

参考文章:https://www.cnblogs.com/2016-10-10/p/6283321.html

八、配置文件:

1、数据源配置:

#数据库相关配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/learn?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456

2、MyBatis配置:

#MyBatis相关配置
mybatis.mapper-locations=classpath*:mappers/*.xml
mybatis.type-aliases-package: com.example.TestNew.entity  # 注意:对应实体类的路径

3、Tomcat配置:

#编码格式
server.tomcat.uri-encoding=utf-8

九、Cache缓存

@EnableCaching

标注在启动类上,开启基于注解的缓存。

@Cacheable(value = {"emp"}, key = "#role.id", condition = "#role.id > 0")

主要针对方法配置,将方法的运行结果进行缓存,以后再要相同的数据,直接从缓存中获取,不用调用方法。

cacheNames/value:指定缓存组件的名字。

key:缓存数据使用的key。默认采用方法参数的值。

​ 编写SpEl:#id(指定参数中的某个值为key),#root.args[0](指定参数列表中的第几个值为key)

keyGenerator:key的生成器。key和keyGenerator二选一使用。

cacheManager:指定缓存管理器;或者cacheResolver指定获取解析器。

condition:指定符合条件的情况下才缓存。

unless:指定符合条件的情况下不缓存。

sync:是否使用异步模式。

@CachePut(value = "emp", key = "#role.id")

主要针对方法配置,保证方法被调用,并将调用结果缓存(缓存更新)。

cacheNames/value:指定缓存组件的名字。

key:缓存数据使用的key。默认采用方法参数的值。

编写SpEl:

  • #id(指定参数中的某个值为key),
  • #root.args[0](指定参数列表中的第几个值为key),
  • #result.id(指定返回对象的id为key)。
@CacheEvict(value = "emp", key = "#role.id", allEntries = false)

主要针对方法配置,将指定缓存清除。

cacheNames/value:指定缓存组件的名字。

key:指定要清除的数据。

allEntries:指定是否清空全部缓存。

beforeInvocation:指定缓存的清除是否在方法之前执行,默认为false(默认为在方法执行之后执行)。

@Caching(
    cacheable = {
        @Cacheable(value = "emp", key = "#lastName")
    },
    put = {
        @CachePut(value = "emp", key = "#result.id"),
        @CachePut(value = "emp", key = "#result.email")
    }
)

@Caching是@Cacheable、@CachePut、@CacheEvict三个注解的合体,用于定义复杂的缓存规则。

@CacheConfig(cacheNames = "emp")

标注在类上,指定类中缓存的公共属性,如指定了cacheNames则类中方法上的缓存注解可以不指定value值。

十、RabbitMQ消息

消息队列是一种进程间或者线程间的异步通信方式

两种模式:

  • 点对点式:消息一旦被消费,就会被删除。
  • 发布订阅式:发布者发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题。
@JmsListener

注解在方法上监听消息代理发布的消息(JMS)。

@RabbitListener

注解在方法上监听消息代理发布的消息(AMQP)。

@EnableJms

开启监听支持(JMS)。

@EnableRabbit

开启监听支持(AMQP)。

交换器类型:

  • direct:当路由键与队列名完全匹配时,交换器就将消息发到对应的队列中。
  • fanout:每个发到fanout类型交换器的消息都会分到所有绑定的队列上去(像广播一样),fanout类型转发消息是最快的。
  • topic:topic交换器通过模式匹配分配消息的路由键属性(模糊匹配)。

十一、Feign

1、目录结构

在这里插入图片描述

2、Feign接口:

@FeignClient(value = "sany-warrant",
//		url = "${warrant.url}",
        url = "http://localhost:80/",
        fallbackFactory = RemoteWarrantAccountServiceFallbackFactory.class,
        configuration = FeignConfiguration.class)
public interface RemoteWarrantAccountService {

    @PostMapping(value = "/sany/warrant/getInformation", headers = {"content-type=application/json"})
    Response getInformation(@Valid @RequestBody WarrantAccount warrantAccount);
}

3、fallback实现类:

@Slf4j
@Component
public class RemoteWarrantAccountServiceFallbackImpl implements RemoteWarrantAccountService {
    @Setter
    private Throwable cause;

    @Override
    public Response getInformation(WarrantAccount warrantAccount) {
        log.error("权证信息:",cause);

        Response response = new Response();
        response.setRecode("00000");
        response.setRemsg("不太对");
        response.setData("嘻嘻");

        return response;
    }
}

4、factory类:

@Component
public class RemoteWarrantAccountServiceFallbackFactory implements FallbackFactory<RemoteWarrantAccountService> {

    @Override
    public RemoteWarrantAccountService create(Throwable throwable) {
        RemoteWarrantAccountServiceFallbackImpl remoteWarrantAccountServiceFallback = new RemoteWarrantAccountServiceFallbackImpl();
        remoteWarrantAccountServiceFallback.setCause(throwable);
        return remoteWarrantAccountServiceFallback;
    }
}

5、config类

@Configuration
public class FeignConfiguration {
    @Bean
    Logger.Level feignLoggerLevel() {
        //这里记录所有,根据实际情况选择合适的日志level
        return Logger.Level.FULL;
    }
}

Feign对外获取到Json串却无法自动转为接收类的解决办法:

JSONObject cibIncomingResp = remoteCibService.incomingApplication(cibIncomingApplicationReq);
CibBaseResp cibBaseResp1 = JSONObject.parseObject(String.valueOf(cibIncomingResp), CibBaseResp.class);

先用JSONObject接收返回数据,然后将JSONObject转为接收类CibBaseResp。

十二、安全管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值