SpringMVC相关注解
@Controller
通常用于修饰controller
层的组件,由控制器负责将用户发来的URL
请求转发到对应的服务接口,通常还需要配合注解@RequestMapping
使用。
@Controller不包含@ResponseBody,在方法return的时候返回字符串是前端页面名字,返回对应前端页面名字的页面。
@RestController
和@Controller一样,用于标注控制层组件,不同的地方在于:它是@ResponseBody和@Controller的合集,也就是说,在当@RestController用在类上时,表示当前类里面所有对外暴露的接口方法,返回数据的格式都为application/json。
@RequestMapping
提供路由信息,负责URL
到Controller
中具体函数的映射,当用于方法上时,可以指定请求协议,比如GET
、POST
、PUT
、DELETE
等等。
作用位置
- 类上:请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录
- 方法上:请求 URL 的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径
参数
- value:用于指定请求的URL。它和path属性的作用是一样的
- method:用于指定请求的方式
- params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样
@GetMapping
除了@RequestMapping
可以指定请求方式之外,还有一些其他的注解,可以用于标注接口路径请求,比如GetMapping
用在方法上时,表示只支持get
请求方法,等价于**@RequestMapping(value="/get",method=RequestMethod.GET)
**
以下同理
@PostMapping
用在方法上,表示只支持post
方式的请求。通常表示添加某些资源
@PutMapping
用在方法上,表示只支持put
方式的请求,通常表示更新某些资源的意思
@DeleteMapping
用在方法上,表示只支持delete
方式的请求,通常表示删除某些资源的意思
@RequestParam
其实post请求可以看成是get请求,只不过post的请求参数URL在请求体中。
作用
-
用于接收URL地址的参数数据
-
用于接受表单类型数据传参,如果是get请求,参数会在浏览器的地址栏显示,如果是post请求,参数会在请求体中以name=%E6%9F%AF%E4%B9%A6%E6%B4%8B&password=123456(URL)显示。请求体中的数据不一定是JSON格式的数据。表单数据一般的请求头(Content-Type: application/x-www-form-urlencoded)
-
手动映射
-
设置默认值,如果前端不设置不传参,那么就使用这个默认值
-
方法中用list集合来接受数据的时候,要加上这个注解,因为list没有指定实现类,不知道使用ArrayList还是LinkedList。
作用位置
用于方法的参数前面,对参数进行解析
参数
-
required:用于指定该参数是否是必须的,默认为TRUE
-
value:
-
defaultValue:设置默认值
前端不传值可以设定默认值
@PathVariable
用于获取请求路径中的参数**,通常用于****restful
风格的api
**上,
@RequestBody
表示请求头的Content-Type
必须为application/json
格式的数据,接收到数据之后会自动将数据绑定到Java
对象上去
@ResponseBody
表示该方法的返回结果直接写入HTTP response body
(响应体)中,返回数据的格式为application/json
bean相关注解
@Component
泛指组件,当组件不好归类的时候,可以使用这个注解进行标注。
通常用于声明直接写的bean
@Service
底层还是@Component,@Controler底层也是@Component用这个注解能更好的说明这是service层的bean注解
通常用于修饰service
层的组件,声明一个对象,会将类对象实例化并注入到bean
容器里面
@Repository
底层还是@Component
通常用于修饰dao
层的组件
@Bean
可以管理第三方的bean交给IOC容器管理,因为第三方的bean我们不能使用@Component 类型的注解声明bean。
使用 @Bean
注解的方法通常位于配置类中(被 @Configuration
注解标记的类),用于声明和配置Bean对象**。这个bean的名字为方法名**
属性
value和name可以声明bean的名称,如果不指定,默认bean的名称就是方法名
起名字的时候就算是首字母大写的,都会被转换成小写首字母
在这里插入图片描述
也可以在引导类中使用(不建议,要保存启动类的纯粹性),因为@SpringBootApplication这个注解包括@Coniguration可以使用这个注解
@Autowired
自动导入依赖的bean
对象,默认时按照byType
(类的类型)方式导入对象,而且导入的对象必须存在,当需要导入的对象并不存在时,我们可以通过配置required = false
来关闭强制验证。
注入方式
构造函数:通过在构造函数上使用 @Autowired
注解,Spring会尝试自动解析并注入这个构造函数所需的依赖对象。
属性注入:通过在属性上使用 @Autowired
注解,Spring会自动解析并注入相应的依赖对象。
set/方法注入:通过在方法上使用 @Autowired
注解,Spring会自动解析并注入相应的依赖对象。
还有一种方法注入,都是和set方法注入差不多的
@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报错误,通过以下几种方案来解决
@Resource
也是自动导入依赖的bean
对象,由**JDK
**提供,默认是按照byName
方式导入依赖的对象;而@Autowired
默认时按照byType
方式导入对象,当然@Resource
还可以配置成通过byType
方式导入对象。
@Primary
Spring自动装配的时候默认使用首选的Bean
@Qualifier
使用@Qualifier
进行更细粒度的控制,选择其中一个候选者,一般于@Autowired
搭配使用
@Scope
用于生命一个spring bean
的作用域,作用的范围一共有以下几种:
- singleton:唯一 bean 实例,Spring 中的 bean 默认都是单例的。默认
- prototype:每次请求都会创建一个新的 bean 实例,对象多例。
- request:每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
- session:每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
- application:每个应用范围内会创建新的实例
@Lazy
在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)。
多例情况下,不要和这个注解一起使用,因为每次使用到都会创建新的对象,每次要使用到才创建。
JPA相关注解
@Entity和@Table
表明这是一个实体类,这两个注解一般一块使用,但是如果表名和实体类名相同的话,@Table
可以省略。
@Id
表示该属性字段对应数据库表中的主键字段。
@Column
表示该属性字段对应的数据库表中的列名,如果字段名与列名相同,则可以省略。
@GeneratedValue
表示主键的生成策略,有四个选项,分别如下:
-
AUTO:表示由程序控制,是默认选项 ,不设置就是这个
-
IDENTITY:表示由数据库生成,采用数据库自增长,Oracle 不支持这种方式
-
SEQUENCE:表示通过数据库的序列生成主键ID,MYSQL 不支持
-
Table:表示由特定的数据库产生主键,该方式有利于数据库的移植
-
@SequenceGeneretor
表示主键的生成策略,有四个选项,分别如下:
-
AUTO:表示由程序控制,是默认选项 ,不设置就是这个
-
IDENTITY:表示由数据库生成,采用数据库自增长,Oracle 不支持这种方式
-
SEQUENCE:表示通过数据库的序列生成主键ID,MYSQL 不支持
-
Table:表示由特定的数据库产生主键,该方式有利于数据库的移植
-
@SequenceGeneretor
-
@Transient
表示该属性并非与数据库表的字段进行映射,ORM 框架会将忽略该属性。
@Basic(fetch=FetchType.LAZY)
用在某些属性上,可以实现懒加载的效果,也就是当用到这个字段的时候,才会装载这个属性,如果配置成fetch=FetchType.EAGER
,表示即时加载,也是默认的加载方式!
@JoinColumn
用于标注表与表之间关系的字段,通常与@OneToOne
、@OneToMany
搭配使用,例如如下
@OneToOne、@OneToMany、@ManyToOne
这三个注解,相当于hibernate
配置文件中的一对一
,一对多
,多对一
配置,比如下面的客户地址表,通过客户 ID,实现客户信息的查询。
AOP常用注解
@Aspect
标注在类上,说明这是一个切面类
@Advice
属性
切点表达式
注解
@PointCut
该注解的作用是将公共的切点表达式抽取出来,需要用到时引用该切点表达式即可。
异常处理相关注解
@ControllerAdvice和@ExceptionHandler
通常组合使用,用于处理全局异常,示例代码如下:
配置相关注解
@Value
可以在任意 Spring 管理的 Bean 中通过这个注解获取任何来源配置的属性值,比如你在application.yml
文件里,定义了一个参数变量!
#配置图片上传存储目录
health:
upload: E:\heima\SpringBoot\cz-health\src\main\resources\image\
在任意的bean
容器里面,可以通过@Value
注解注入参数,获取参数变量值。
@Configuration
表示声明一个 Java 形式的配置类,Spring Boot 提倡基于 Java 的配置,相当于你之前在 xml 中配置 bean,比如声明一个配置类AppConfig
,然后初始化一个Uploader
对象。
@EnableAutoConfiguration
@EnableAutoConfiguration
可以帮助SpringBoot
应用将所有符合条件的@Configuration
配置类,全部都加载到当前SpringBoot
的IOC容器里,并创建对应配置类的Bean
,并把该Bean
实体交给IoC
容器进行管理。
某些场景下,如果我们想要避开某些配置类的扫描(包括避开一些第三方jar
包下面的配置,可以这样处理。
@Configuration
@EnableAutoConfiguration(exclude = { org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class})
public class AppConfig {
//具有业务方法
}
@ConfigurationProperties
**@Value
**在每个类中获取属性配置值的做法,其实是不推荐的。
配置类一定要有set和get方法
一般在企业项目开发中,不会使用那么杂乱无章的写法而且维护也麻烦,通常会一次性读取一个 Java 配置类,然后在需要使用的地方直接引用这个类就可以多次访问了,方便维护。很多集成的技术也是这样子进行配置的,比如数据库连接示例如下:
aliyun:
oss:
endpoint: "https://oss-cn-guangzhou.aliyuncs.com"
accessKeyId: LTAI5tGamLNG624wt8QFukAS
accessKeySecret: W28L09r9oEEzFzM9pFymh2GjtD18BL
bucketName: tlias-web-management-ksy
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
@EnableConfigurationProperties
统一管理@ConfigurationProperties。当@ConfigurationProperties这个注解没有和@Componen一起使用的时候,就无法被加载到IOC容器中,就无法读取配置文件。@EnableConfigurationProperties有一个@Import可以把有@ConfigurationProperties这个注解的类加载到IOC容器中,就可以读取到配置文件中的配置。
@ComponentScan
标注哪些路径下的类需要被Spring
扫描,用于自动发现和装配一些Bean
对象,默认配置是扫描当前文件夹下和子目录下的所有类,如果我们想指定扫描某些包路径,可以这样处理。
@ComponentScan(basePackages = {"com.xxx.a", "com.xxx.b", "com.xxx.c"})
@SpringBootApplication
等价于使用@Configuration
、@EnableAutoConfiguration
、@ComponentScan
这三个注解,通常用于全局启动类上。
把@SpringBootApplication
换成@Configuration
、@EnableAutoConfiguration
、@ComponentScan
这三个注解,一样可以启动成功,@SpringBootApplication
只是将这三个注解进行了简化!
示例如下:
@SpringBootApplication
public class PropertyApplication {
public static void main(String[] args) {
SpringApplication.run(PropertyApplication.class, args);
}
}
@EnableTransactionManagement
表示开启事务支持,等同于 xml 配置方式的<tx:annotation-driven />
@SpringBootApplication
@EnableTransactionManagement`
public class PropertyApplication {
public static void main(String[] args) {
SpringApplication.run(PropertyApplication.class, args);
}
}
@Condition
从 Spring4 开始,可以通过@Conditional
注解实现按条件装载bean
对象,目前 Spring Boot 源码中大量扩展了@Condition
注解,用于实现智能的自动化配置,满足各种使用场景。下面我给大家列举几个常用的注解:
@ConditionalOnBean
:当某个特定的Bean
存在时,配置生效@ConditionalOnMissingBean
:当某个特定的Bean
不存在时,配置生效@ConditionalOnClass
:当Classpath
里存在指定的类,配置生效@ConditionalOnMissingClass
:当Classpath
里不存在指定的类,配置生效@ConditionalOnExpression
:当给定的SpEL
表达式计算结果为true
,配置生效@ConditionalOnProperty
:当指定的配置属性有一个明确的值并匹配,配置生效
@Configuration
public class ConditionalConfig {
/**
* 当AppConfig对象存在时,创建一个A对象
* @return
*/
@ConditionalOnBean(AppConfig.class)
@Bean
public A createA(){
return new A();
}
/**
* 当AppConfig对象不存在时,创建一个B对象
* @return
*/
@ConditionalOnMissingBean(AppConfig.class)
@Bean
public B createB(){
return new B();
}
/**
* 当KafkaTemplate类存在时,创建一个C对象
* @return
*/
@ConditionalOnClass(KafkaTemplate.class)
@Bean
public C createC(){
return new C();
}
/**
* 当KafkaTemplate类不存在时,创建一个D对象
* @return
*/
@ConditionalOnMissingClass(KafkaTemplate.class)
@Bean
public D createD(){
return new D();
}
/**
* 当enableConfig的配置为true,创建一个E对象
* @return
*/
@ConditionalOnExpression("${enableConfig:false}")
@Bean
public E createE(){
return new E();
}
/**
* 当filter.loginFilter的配置为true,创建一个F对象
* @return
*/
@ConditionalOnProperty(prefix = "filter",name = "loginFilter",havingValue = "true")
@Bean
public F createF(){
return new F();
}
}
@PropertySource
这个注解是用来读取我们自定义的配置文件的,比如导入test.properties
和bussiness.properties
两个配置文件,用法如下:
使用
@ImportResource
用来加载 xml 配置文件,比如导入自定义的aaa.xml
文件,用法如下:
测试相关注解
@ActiveProfiles
一般作用于测试类上, 用于声明生效的 Spring 配置文件,比如指定application-dev.properties
配置文件。
@RunWith和@SpringBootTest
一般作用于测试类上, 用于单元测试用,示例如下:
还有统一管理