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。