Spring与SpringBoot 常用注解
2023-05-04 15:29:25 2 举报
AI智能生成
Spring与SpringBoot 常用注解 快速入门SPRING
作者其他创作
大纲/内容
@Value(\"张三\")
直接把字符串赋值给当前字段
普通字符串
@Value(\"${userName}\")
先进行占位符的替换,然后将替换后的字符串赋值给当前字段
根据操作系统环境变量、JVM环境变量、properties文件作为替换的数据来源
占位符
@Value(\"#user.userName\")
先解析Spring表达式,将结果赋值给当前字段
注意:解析Spring表达式的结果可能是字符串,也可能是一个Bean对象
SpringEL
基于@Value做扩展
@Value
不会自动注入
NO
根据set方法所对应的属性名查找Bean对象进行注入
BY_NAME
根据set方法所对应的属性类型查找Bean对象进行注入
BY_TYPE
注意:跟@AutoWired注解提供的依赖注入功能是完全对立的
autowire
默认为true,表示可以用来作为依赖注入的候选者;改为false之后,表示不能被用来做依赖注入的候选者
autowireCandidate
@Bean不仅仅只能写在@Configuration中,还可以写在@Component中
@Target({ ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Bean@Scope(\"prototype\")public @interface PrototypeBean{}
比如我们可以实现一个@PrototypeBean
@Bean除了可以写在方法上,也能写在某个注解上,使得可以自定义注解来模拟@Bean的功能
外框
@Bean
顾名思义,@ComponentScan就是用来扫描@Component注解的,默认情况下Spring会把扫描路径下所有@Componet注解的类扫描出来,并生产对应的Bean对象
可以制定某个注解,表示类上有这个注解的才是Bean
ANNOTATION
可以制定某个类,表示只有这个类才是Bean
ASSIGNABLE_TYPE
可以制定一个AspectJ的表达式,表示符合这个表达式的才是Bean
ASPECTJ
可以制定一个正则表达式,表示符合这个表达式的才是Bean
REGEX
可以制定一个TypeFilter实现类,自定义匹配逻辑
CUSTOM
可以自定义过滤条件,符合条件的才是Bean
includeFilters
类型同上,只不过符合条件的就排除
可以自定义过滤条件,符合条件的不是Bean
excludeFilters
跟@ComponentScan注解没有关系,跟扫描有关
默认情况下,Spring扫描时有可能需要扫描很多很多的类,具体看制定的路径下类的数量,那么这个过程就比较浪费时间
在Spring中提供了一种加快扫描的方式,也就是扫描索引,不过这个索引得程序员自己去创建一个META-INFO/spring。components文件,并在这个文件中制定哪些类是Bean,对与Spring而言,它就会去读取这个文件中的内容,并把文件中制定的类当作Bean,而不用去扫描了,这样提高了扫描速度
扫描索引
@ComponentScan
Spring在扫描时,如果发现一个类上存在@Conditional注解,那么就会获取该注解中所配置的Condition接口实现类,并调用其matches方法,判断是否匹配,匹配则把该类作为Bean
TYPE上使用时
当把@Conditional注解加载一个@Bean注解的方法上时,Spring在解析该@Bean方法时,会发现存在一个@Conditional注解,从而去判断是否符合当前条件,符合才会生成对应的Bean
METHOD上使用时
比如可以用来判断当前BeanFactory中是否存在某个Bean
BeanFactory
比如可以用来判断当前环境变量中是否存在某个key
Environment
比如可以用来判断当前是否存在某个类
ClassLoader
可以拿到一些Spring容器相关的东西
ConditionContext
比如可以用来判断当前类上是否存在某个注解
@Conditional注解所在的类上的元数据信息
AnnotatedTypeMetadata
Condition接口
条件注解
@Conditional
表示字段注入
FIELD
表示Set方法注入
METHOD
表示构造方法注入
CONSTRUCTOR
表示可以写在其他注解上,使得该注解拥有@Autowired注解相关功能
ANNOTATION_TYPE
尽管@Autowired注解可以加在普通方法或构造方法的参数前,但是Spring框架中大部分地方都忽略了这种情况下的@Autowired注解,仅仅在spring-test模块中对于JUnit Jupiter的支持中,支持了参数前的@Autowired注解
PARAMETER
默认为true,表示一定要给某个属性找到Bean对象并赋值,如果找不到Bean对象则会报错
构造方法上required属性会失效,相当于一直为true
required属性
static字段或方法上不会进行依赖注入的
static
@Autowried
当把@Lazy注解写在某个类上(该类上有@Component注解)时,表示该Bean是一个懒加载的Bean,表示该Bean是在用到时才去创建,而不是Spring启动时创建
当把@Lazy注解写在一个@Configuration注解所在类上时,表示该类内部所有@Bean所定义的Bean都是懒加载的Bean
TYPE
当把@Lazy注解加在一个字段上时,Spring会给该属性赋值一个CGLIB所生成的代理对象,当该代理对象执行某个方法时,才会真正的根据字段的类型和名字从Spring容器中找到某个Bean对象,并执行该Bean对象所对应的方法
当把@Lazy注解写在一个@Autowired注解所在方法上时,那么Spring会给该方法的所有入参赋值一个代理对象
当把@Lazy注解写在一个@Autowired注解所在方法的某个参数前时,那么Spring会给该入参赋值一个代理对象
当把@Lazy注解写在一个@Autowired注解所在构造方法上时,那么Spring会给该方法的所有入参赋值一个代理对象
注意:可以解决循环依赖
@Lazy
先判断字段名字所对应的Bean是否存在,如果存在则把这个Bean赋值给属性,如果不存在则根据字段类型找Bean
没有制定name
制定了名字,就只根据名字去找,找到了就用,找不到就报错
制定了name
注意:@Resource注解是JDK层面定义的,Spring负责实现,负责提供对这个注解的支持
@Resource
被@Configuration注解修饰的类,首先是一个Bean,并且是一个配置Bean
proxyBeanMethods默认t为rue,表示是Full配置Bean
proxyBeanMethods为false,表示是Lite配置Bean
有@Configuration注解
存在@Component注解就是Lite配置Bean
存在@ComponentScan注解就是Lite配置Bean
存在@Import注解就是Lite配置Bean
存在@ImportResource注解就是Lite配置Bean
存在@Bean注解的方法就是Lite配置Bean
无@Configuration注解
什么是配置Bean?
不如处理@ComponentScan就会去扫描
比如处理@Improt注解就会将某个类导入成为Bean
比如处理@Bean就会解析对应方法生成Bean
对于配置Bean,不仅仅只是存放到Spring容器中,Spring还会去解析配置Bean
配置Bean对应的是配置类的代理对象
true
配置Bean对应的是配置类的普通对象
false
proxyBeanMethods
配置Bean有什么用?
@Configuration
直接将该类当作Bean
普通类型
将SelectImport()方法返回的类当作Bean
ImportSelector类型
将selectImport()方法返回的类当作Bean
与ImportSelector类型的区别在于selectImport()方法执行时机不同
DeferredImportSelector类型
在registerBeanDefinitions()方法中注册BeanDefinition
ImportBeanDefinitionRegistrar类型
@Import
@Lookup注解的作用在官网上叫做方法注入
@Autowired、@Resource、@Value是属性注入,是给某个属性赋值
@Lookup注解的作用是给某个方法赋值一个Bean,所以叫方法注入(和Set方法、构造方法注入做区分),在调用这个方法时会返回所制定的Bean对象
正常情况下抽象类是不能成为Bean对象的,但是如果抽象类中的抽象方法上用了@Lookup注解,那么最终也能产生一个Bean对象,并且该Bean对象可以调用该抽象方法,并返回制定的Bean对象
方法替换器
MethodReplacer
@Lookup
在Spring容器中可能存在一个类型的多个Bean对象,这是可以通过在某个Bean对象上使用@Primary注解标识该Bean作为这个类型下的主Bean,在依赖注入时会优先使用
@Primary
常用注解
@Service
@Controller
@Repository
@Component
通过解析某个方法作为Bean
导入类或BeanDefinition作为Bean
导入一个spring.xml文件,通过解析该文件注册Bean
@ImportResource
通过注册BeanDefinition来注册Bean
BeanDefinitionRegistryPostProcessor
将自己new的一个对象注册为Bean
SmartFactoryBean
FactoryBean
通过Supplier接口来提供一个对象作为Bean
applicationContext.registerBean()
直接将某个类注册为Bean
applicationContext.register()
注册一个BeanDefinition,就相对于注册了一个Bean
applicationContext.registerBeanDefinition()
注册一个Bean有哪些方式
通过一个Map来实现
单例池
单例
无需额外支持,每次创建一个Bean直接返回
多例
request.getAttribute()
request.setAttribute()
Request
session.getAttribute()
session.setAttribute()
Session
servletContext.getAttribute()
servletContext.setAttribute()
application
Bean的作用域
一个Bean可以有自己的父Bean,那么子Bean就会继承父Bean中所定义的各种属性,比如scope
BeanDefinition合并
在创建一个对象前,得确保对应的类已经加载了
注意:在扫描时,是利用的ASM继续去解析的类,并没有加载类
类加载
提供了一个扩展点,可以让程序员在这个位置控制某个Bean对象的创建
实例化前
Supplier创建对象
工程方法创建对象
推断构造方法
实例化
提供了一个扩展点,可以让程序员在这个位置来修改BeanDefinition,比如制定初始化方法
BeanDefinition后置处理
提供了一个扩展点,可以让程序员在这个位置针对Bean对象做一些处理,比如执行方法、给某个属性赋值等
实例化后
处理@Autowired注解
处理@Resource注解
处理@Value主键
等等...
给某个属性赋值
属性填充
回传beanName给bean对象
BeanNameAware
回传classLoader给bean对象
BeanClassLoaderAware
回传beanFactory给bean对象
BeanFactoryAware
Aware回调
执行对应的方法
处理@PostConstruct注解
回传环境变量给bean对象
EnvironmentAware
回传占位符解析器给bean对象
EmbeddedValueResolverAware
回传资源加载器给bean对象
ResourceLoaderAware
回传事件发布器给bean对象
ApplicationEventPublisherAware
回传国际化资源给bean对象
MessageSourceAware
回传Spring容器ApplicationContext给bean对象
ApplicationContextAware
初始化前
查看当前Bean对象是否实现了InitializingBean接口,如果实现了就调佣其afterPropertiesSet()方法
执行BeanDefinition中制定的初始化方法
初始化
判断当前Bean是否进行AOP,如果需要则进行AOP
初始化后
当所有的非懒加载单例Bean都创建好之后,会判断是否存在某个单例Bean实现了SmartInitializingSingleton接口,如果实现了就执行afterSingletonsIistantiated()方法
SmartInitializingSigleton
Bean创建的生命周期
Bean相关
更方便进行国际化操作
MessageSource
国际化
文件资源
网络资源
更方便读取某个资源
context.getResource()
资源加载
操作系统环境变量
JVM环境变量 -D
properties文件
更方便获取环境变量
context.getEnvironment()
获取运行时环境
某个类作为事件监听器
ApplicationListener
某个方法作为事件监听器
@EventListener
事件发布
利用Ordered接口来制定顺序
OrderComparator
利用@Order注解来制定顺序
AnnottionAwareOrderComparator
Order比较器
类名
类上的注解
类中的方法
读取类上各种信息
SimpleMetadataReaderFactory
类的元数据读取器
实用工具
by type
by name
主要利用的是类中的Set方法
可以理解为Spring自带的自动注入功能,和@Autowired注解没有关系
autowire mode
先by type,再by name
属性注入
待注入参数为private且不能用final修饰,存在安全问题对象可能被修改
setter方法注入
构造方法注入(官方推荐)
用@Autowired注解来标识要给哪个属性进行自动注入
@Autowired
先by type,再by name
可以加在字段上
可以加在方法上
用@Resource注解来标识要给哪个属性进行自动注入
用@Value注解来给属性赋值
处理自定义注解
自定义BeanPostProcessor
依赖注入有哪些方式?
代理对象工程,封装了JDK动态代理和CGLIB
ProxyFactory
利用FactoryBean机制将代理对象作为一个Bean
ProxyFactoryBean
制定某个beanName让Spring对其进行AOP
BeanNameAtuoProxyCreator
制定某个Advisor,让Spring对其匹配的Bean对象进行AOP
DefaultAdvisorAutoProxyCreator
开启支持AspectJ
@EnableAspectAutoProxy
Spring AOP有哪些使用方式?
通过ApplicationContextAware回调,Spring会把ApplicationContext传入setApplicationContext方法
因为Spring在进行依赖注入时做了特殊处理,也支持将ApplicationContext对象注入给某个字段
获取ApplicaitonContext有哪些方式?
利用JDK中自带的
PorperEditor
Spring中实现的
ConversionService
合二为一
TypeConverter
Spring类型转化有哪些方式?
父子类
父子BeanDefinition
父子BeanFactory
父子ApplicationContext
Spring中有哪些父子?
其他
Spring核心技术总结
用法:用在属性、方法上
含义:byType 方式完成自动装配,把配置好的 Bean 拿来用,完成属性、方法的组装。当加上(required=false )时,就算找不到 bean 也不报错。
@Autowired
泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。一般公共的方法我会用上这个注解
用于数据持久层,经常标记到DAO类上
@Respository
用于服务层,经常标注到Service类上,常需要注入DAO层
MVC控制层Bean,常需要注入Service层
@RestController 注解,它继承自 @Controller 注解。 4.0 之前的版本, Spring MVC 的组件都使用 @Controller 来标识当前类是一个控制器 servlet 。使用这个特性,我们可以开发 REST 服务的时候直接使用@RestController 。
@RestController
一般用来声明配置类
singleton
prototype
request
session
声明 Spring Bean 的作用域
@Scope
Bean处理
GET请求,从服务器获取特定资源
@GetMapping
POST请求,在服务器上创建一个新的资源
@PostMapping
PUT请求,更新服务器上的资源
@PutMapping
DELETE 请求,从服务器删除特定的资源
@DeleteMapping
HTTP请求
用在方法的参数前面,获取请求中表单类型的key=value格式的数据
@RequestParam
路径变量,参数与大括号里的名字一样要相同。
@PathVariable
获取请求body中的数据,常用于搭配@PostMapping请求来提交对象数据
@RequestBody
表示该方法的返回结果直接写入HTTP response body 中,格式为 json
@ResponseBody
前后端参数传递
直接读取各种配置源的属性名
@value
读取配置信息并与 bean 绑定
@ConfigurationProperties
指定加载自定义的配置文件
@PropertySource
读取配置
@NotEmpty
@NotBlank
@Null
@NotNull
@AssertTrue
@AssertFalse
@Email
@Min(value)
@Max(value)
@DecimalMin(value)
@DecimalMax(value)
@Past
@Future
Bean字段验证注解
用于标注验证对象的级联属性
@Valid
Spring提供的注解,于SpringMVC一起使用,标注方法参数需要检查
@Validated
参数校验
注解定义全局异常处理类,包含@Component所以可以被Spring扫描到
@ControllerAdvice
注解声明异常处理方法,表示遇到这个异常,就执行标注的方法
@ExceptionHandler
统一异常处理
声明数据库实体类
@Entity
设置表明
@Table
声明一个字段为主键
@Id
声明主键的生成策略
@GeneratedValue
声明字段,经常用于属性名和表字段的映射
@Column
指定不需要持久化的字段
@Transient
声明某个字段为大字段
@Lob
声明枚举类型的字段
@Enumerated
加在DAO方法上,提示是修改操作
@Modifying
表示所有该类的public 方法都配置相同的事务属性信息
作用于类上
当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息
作用于方法上
@Transactional
JPA数据持久化
作用在类上用于过滤掉特定字段不返回或者不解析
@JsonIgnoreProperties
一般用于属性上,作用和上面的@JsonIgnoreProperties 一样
@JsonIgnore
用来格式化 json 数据
@JsonFormat
扁平化对象
@JsonUnwrapped
JSON格式处理
常作用于测试类上, 用于声明生效的 Spring 配置文件
@ActiveProfiles
声明一个方法为测试方法
@Test
被声明的测试方法的数据会回滚,避免污染测试数据
@Transactional
Spring Security 提供的,用来模拟一个真实用户,并且可以赋予权限
@WithMockUser
测试处理
等价于以默认属性使用 @Configuration、@EnableAutoConfiguration、@ComponentScan
@SpringBootApplication
Spring Boot 提倡基于 Java 的配置,相当于你之前在 xml 中配置 bean
类级别的注解,这个注解告诉 Spring Boot 根据添加的 jar 依赖猜测你想如何配置 Spring
@EnableAutoConfiguration
标注哪些路径下的类需要被Spring扫描
配置了某个特定的Bean
@ConditionalOnBean
没有配置特定的Bean
@ConditionalOnMissingBean
Classpath里有指定的类
@ConditionalOnClass
Classpath里没有指定的类
@ConditionalOnMissingClass
给定的SpEL表达式计算结果为true
@ConditionalOnExpression
Java的版本匹配特定值或者一个范围值
@ConditionalOnJava
参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNDI InitialContext
@ConditionalOnJndi
指定的配置属性要有一个明确的值
@ConditionalOnProperty
Classpath里没有指定的资源
@ConditionalOnResource
这是一个Web应用程序
@ConditionalOnWebApplication
这不是一个Web应用程序
@ConditionalOnNotWebApplication
配置启动
Spring Boot 常用注解
数据的校验的重要性就不用说了,即使在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。
JSR(Java Specification Requests) 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,可以直接将这些注解加在我们 JavaBean 的属性上面,这样就可以在需要校验的时候进行校验了,非常方便!
span style=\
注:更新版本的 spring-boot-starter-web 依赖中不再有 hibernate-validator 包(如2.3.11.RELEASE),需要自己引入 spring-boot-starter-validation 依赖。
需要注意的是: 所有的注解,推荐使用 JSR 注解,即 javax.validation.constraints,而不是 org.hibernate.validator.constraints
一些常用的字段验证的注解:ul style=\
验证请求体(RequestBody)
我们在需要验证的参数上加上了 @Valid 注解,如果验证失败,它将抛出 MethodArgumentNotValidException。
验证请求参数(Path Variables 和 Request Parameters):一定一定不要忘记在类上加上 @Validated 注解了,这个参数可以告诉 Spring 去校验方法参数。
简单介绍
在 Spring/Spring Boot 中做参数校验
更多详细内容查看
相关注解:@ControllerAdvice:注解定义全局异常处理类@ExceptionHandler:注解声明异常处理方法
如何使用呢?拿我们上面的参数校验这块来举例子。如果方法参数不对的话就会抛出 MethodArgumentNotValidException,我们来处理这个异常。
SpringBoot 处理异常的几种常见姿势
封装一个优雅的 Spring Boot 全局异常处理:
全局处理 Controller 层异常
在要开启事务的方法上使用 @Transactional 注解即可!
我们知道 Exception 分为运行时异常 RuntimeException 和非运行时异常。在 @Transactional 注解中如果 不配置 rollbackFor属性,那么事务只会在 遇到 RuntimeException 的时候才会 回滚,加上 rollbackFor=Exception.class。可以让事务在 遇到非运行时异常时也回滚。
@Transactional 注解一般可以作用在类或者方法上:ul style=\
详细讲解:
事务 @Transaction
@JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。
@JsonIgnore 一般用于类的属性上,作用和上面的 @JsonIgnoreProperties 一样。
1. 过滤 json 数据
@JsonFormat 一般用来格式化 json 数据。
2. 格式化 json 数据
嵌套类:
使用 @JsonUnwrapped 扁平对象之后:
3. 扁平化对象
Json 数据处理
@ActiveProfiles 一般作用于测试类上, 用于声明生效的 Spring 配置文件。
@Test声明一个方法为测试方法@Transactional 被声明的测试方法的数据会回滚,避免污染测试数据。@WithMockUser Spring Security 提供的,用来模拟一个真实用户,并且可以赋予权限。
测试相关
这个注解是 Spring Boot 项目的基石,创建 SpringBoot 项目之后会默认在主类加上:
我们可以把 @SpringBootApplication 看作是 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合。
根据 SpringBoot 官网,这三个注解的作用分别是:@EnableAutoConfiguration:启用 SpringBoot 的自动配置机制@ComponentScan: 扫描被 @Component (@Repository,@Service,@Controller) 注解的 bean,注解默认会扫描该类所在的包下所有的类。@Configuration:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
自动导入 Bean 对象到类中
将 Bean 类注入到 Spring 组件
@RestController 注解是 @Controller 和 @ResponseBody 的合集,表示这是个控制器 bean,并且是 将函数的返回值 直接填入 HTTP 响应体中,是 REST 风格的控制器。
单独使用 @Controller 不加 @ResponseBody 的话一般是用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。@Controller +@ResponseBody 返回 JSON 或 XML 形式数据
@Scope:声明 Spring Bean 的作用域,使用方法:
四种常见的 Spring Bean 的作用域:singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。prototype : 每次请求都会创建一个新的 bean 实例。request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。session : 每一个 HTTP Session 会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
声明 Bean 的作用域
@Configuration:一般用来声明配置类,可以使用 @Component 注解替代,不过使用 @Configuration 注解声明配置类更加语义化。
声明配置类 Bean
Spring Bean 相关
5 种常见的请求类型:GET :请求 从服务器获取特定资源。举个例子:GET /users(获取所有学生)POST :在服务器上 创建 一个新的资源。举个例子:POST /users(创建学生)PUT :更新 服务器上的资源(客户端提供更新后的整个资源)。举个例子:PUT /users/2(更新编号为 2 的学生)DELETE :从服务器 删除 特定的资源。举个例子:DELETE /users/2(删除编号为 2 的学生)PATCH :更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少。
GET 请求:@GetMapping(\"users\") 等价于 @RequestMapping(value=\"/users\
POST 请求:@PostMapping(\"users\") 等价于 @RequestMapping(value=\"/users\
PUT 请求:@PutMapping(\"/users/{userId}\") 等价于 @RequestMapping(value=\"/users/{userId}\
DELETE 请求:@DeleteMapping(\"/users/{userId}\") 等价于 @RequestMapping(value=\"/users/{userId}\
PATCH 请求:一般实际项目中,我们都是 PUT 不够用了之后才用 PATCH 请求去更新数据。
处理常见的 HTTP 请求类型
@PathVariable 用于获取 路径参数,@RequestParam 用于获取 查询参数。
@PathVariable 和 @RequestParam
用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且 Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用 HttpMessageConverter 或者自定义的 HttpMessageConverter 将请求的 body 中的 json 字符串转换为 java 对象。
UserRegisterRequest对象:
这样我们的后端就可以直接把 json 格式的数据映射到我们的 UserRegisterRequest 类上。
👉 需要注意的是:一个请求方法只可以有一个 @RequestBody,但是可以有多个 @RequestParam 和 @PathVariable。 如果你的方法必须要用两个 @RequestBody 来接受数据的话,大概率是你的数据库设计或者系统设计出问题了!
前后端传值
很多时候我们需要将一些常用的配置信息比如阿里云 oss、发送短信、微信认证的相关配置信息等等放到配置文件中。
下面我们来看一下 Spring 为我们提供了哪些方式帮助我们从配置文件中读取这些配置信息。
编写一个 yaml 的配置文件:
使用 @Value(\"${property}\") 读取比较简单的配置信息:
需要注意的是 @value这种方式是不被推荐的,Spring 比较建议的是下面几种读取配置信息的方式。
1. 通过 @value 读取比较简单的配置信息
LibraryProperties 类上加了 @Component 注解,我们可以像使用普通 bean 一样将其注入到类中使用。
这个时候你就可以像使用普通 bean 一样,将其注入到类中使用:
控制台输出:
2. 通过 @ConfigurationProperties 读取并与 bean 绑定
我们先将 application.yml 修改为如下内容,明显看出这不是一个正确的 email 格式:
ProfileProperties 类没有加 @Component 注解:
我们在要使用 ProfileProperties 的地方使用 @EnableConfigurationProperties 注册我们的配置 bean:
因为邮箱格式不正确,所以程序运行的时候就报错,根本运行不起来,保证了数据类型的安全性:
我们把邮箱测试改为正确的之后再运行,控制台就能成功打印出读取到的信息:
3. 通过 @ConfigurationProperties 读取并校验
编写一个类,定义一些对象来存储配置:
只需要在使用的地方注入这个类,就可以直接调用 get 方法获取:
4. @PropertySource 读取指定的 properties 文件
读取配置文件
分支主题
常用注解@SpringBootApplication包含@Configuration、@EnableAutoConfiguration、@ComponentScan通常用在主类上@Repository用于标注数据访问组件,即DAO组件@Service用于标注业务层组件@RestController用于标注控制层组件(如struts中的action),包含@Controller和@ResponseBody@ResponseBody表示该方法的返回结果直接写入HTTP response body中@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注@ComponentScan 组件扫描。相当于,如果扫描到有@Component @Controller @Service等这些注解的类,则把这些类注册为bean@Configuration指出该类是 Bean 配置的信息源,相当于XML中的,一般加在主类上@EnableAutoConfiguration让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置,一般加在主类上@AutoWiredbyType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 当加上(required=false)时,就算找不到bean也不报错@Resource(name=\"name\
自动导入对象到类中,被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中。
通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。
对应持久层即 Dao 层,主要用于数据库相关操作
对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层
对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。
singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
prototype : 每次请求都会创建一个新的 bean 实例
request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效
作用域
Configuration
Spring Bean
用于获取路径参数
用于获取查询参数
一个请求方法只可以有一个@RequestBody
被注释的字符串的不能为 null 也不能为空
被注释的字符串非 null,并且必须包含一个非空白字符
@NotBlank
被注释的元素必须为 null
@Null
被注释的元素必须不为 null
@NotNull
被注释的元素必须为 true
被注释的元素必须为 false
@AssertFalse
被注释的元素必须符合指定的正则表达式
被注释的元素必须是 Email 格式
被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Min(value)
被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Max(value)
@DecimalMin(value)
@DecimalMax(value)
被注释的元素的大小必须在指定的范围内
被注释的元素必须是一个数字,其值必须在可接受的范围内
被注释的元素必须是一个过去的日期
被注释的元素必须是一个将来的日期
字段验证的注解
验证请求参数(Path Variables 和 Request Parameters)
@ControllerAdvice :注解定义全局异常处理类
@ExceptionHandler :注解声明异常处理方法
作用于类:当把@Transactional 注解放在类上时,表示所有该类的public 方法都配置相同的事务属性信息。
作用于方法:当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息。
事务 @Transactional
启用 SpringBoot 的自动配置机制
允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
@GetMapping(\"users\") 等价于@RequestMapping(value=\"/users\
GET 请求
@PostMapping(\"users\") 等价于@RequestMapping(value=\"/users\
POST 请求
@PutMapping(\"/users/{userId}\") 等价于@RequestMapping(value=\"/users/{userId}\
PUT 请求
@DeleteMapping(\"/users/{userId}\")等价于@RequestMapping(value=\"/users/{userId}\
DELETE 请求
PATCH 请求
HTTP 请求类型
使用 @Value(\"${property}\") 读取比较简单的配置信息
@ConfigurationProperties读取配置信息并与 bean 绑定
@PropertySource读取指定 properties 文件
读取配置信息
@Entity声明一个类对应一个数据库实体。
@Table 设置表名
创建表
1.通过 @GeneratedValue直接使用 JPA 内置提供的四种主键生成策略来指定主键生成策略
2.通过 @GenericGenerator声明一个主键策略,然后 @GeneratedValue使用这个策略
@Id :声明一个字段为主键。
创建主键
@Column 声明字段
设置字段类型
除了 @Transient关键字声明, 还可以采用下面几种方法
@Transient :声明不需要与数据库映射的字段,在保存的时候不需要保存进数据库
指定不持久化特定字段
更详细的声明
@Lob:声明某个字段为大字段。
声明大字段
使用
可以使用枚举类型的字段,不过枚举字段要用@Enumerated注解修饰
创建枚举类型的字段
@CreatedDate: 表示该字段为创建时间时间字段,在这个实体被 insert 的时候,会设置值
@CreatedBy :表示该字段为创建人,在这个实体被 insert 的时候,会设置值@LastModifiedDate、@LastModifiedBy同理。
@EnableJpaAuditing:开启 JPA 审计功能。
增加审计功能
删除/修改数据
@OneToOne 声明一对一关系
@OneToMany 声明一对多关系
@ManyToOne声明多对一关系
@MangToMang声明多对多关系
关联关系
JPA 相关
@JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。
@JsonIgnore一般用于类的属性上,作用和上面的@JsonIgnoreProperties 一样。
过滤 json 数据
@JsonFormat一般用来格式化 json 数据。
格式化 json 数据
代码
结果
之前
扁平对象之后
json 数据处理
Spring常用注解
Spring&SpringBoot 常用注解总结
0 条评论
回复 删除
下一页