Spring Boot 常见注解的用法和功能
springboot 常用注解说明
目录
前言
Spring Boot提供了大量注解,主要用于简化配置和开发,大致可分为核心注解、Web注解、依赖注入注解、数据访问注解、配置注解、条件注解、测试注解。
一. 核心注解
- @SpringBootApplication
作用: 标注一个主程序类,表明这是一个Spring Boot 应用程序的入口
用法:通常放在主类上,一般都会用在项目启动类的主方法上
说明: 这是一个复合注解,组合了@Configuration、@EnableAutoConfiguration和@ComponentScan。
@Configuration: 标识一个类作为配置类,类似于Spring XML配置文件。
@EnableAutoConfiguration: 启用Spring Boot的自动配置机制,根据项目中的依赖和应用上下文自动配置Spring应用程序
@ComponentScan: 自动扫描指定包及其子包中的Spring组件
示例:
package com.demo;
import com.cnpc.epai.assetcatalog.StartApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyStartApplication {
public static void main(String[] args) {
SpringApplication.run(MyStartApplication.class, args);
}
}
- @EnableAutoConfiguration
作用: Spring Boot 会根据添加的jar依赖自动配置项目
用法:只需在启动类或配置类上添加该注解即可(注意:SpringBootApplication 已经组合了这个注解所以在启动类上可以不使用)
说明: @SpringBootApplication 注解已经组合了这个注解所以在启动类上可以不使用
示例:
package com.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@EnableAutoConfiguration
public class MyStartApplication {
public static void main(String[] args) {
SpringApplication.run(MyStartApplication.class, args);
}
}
- @ComponentScan
作用: 自动扫描并加载符合条件的组件或者 bean,定义扫描的路径
用法:通常与 @SpringBootApplication
一起使用,无需单独添加
说明: 主要是用来扫描 bean,如果启动未加载到 bean 可以通过这个注解指定 bean 扫描加载路径(注意:这个注解也已经整合在@SpringBootApplication 注解中,所以可以不用再主类中添加这个注解)
示例:
package com.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
@ComponentScan(
basePackages = {"com.demo", "com.test"}, //指定扫描那些包下需要加载的bean
//includeFilters属性 设置扫描过滤条件,指定扫描的时候按照什么规则包含哪些组件,满足该条件才进行扫描
includeFilters = {
//FilterType.ANNOTATION 过滤类型设置
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyAnnotation.class),
//FilterType.REGEX 过滤出以Impl的组件
@ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*Impl")
},
//excludeFilters属性 设置排除的过滤条件,指定扫描的时候按照什么规则排除哪些组件,不扫描哪些包
excludeFilters = {
// 排除类型
@ComponentScan.Filter(type = FilterType.ANNOTATION, value = MyDemo.class)
}
)
public class MyStartApplication {
public static void main(String[] args) {
SpringApplication.run(MyStartApplication.class, args);
}
}
package com.demo;
public class MyAnnotation {
}
package com.demo;
public class MyDemo {
}
- @Configuration
作用: @Configuration 注解
用于标识一个类是配置类
用法:直接在类上添加这个注解,一般都是配合 @bean 注解使用
说明: 表明这个类是一个java配置类
示例:
package com.demo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedisConfig {
@Bean
public MyDemo getMyDemo(){
return new MyDemo();
}
}
二. Web注解
- @RestController
作用: @RestController 注解结合了 @Controller 和 @ResponseBody 两个注解的功能,用于标记一个类或者方法,表示该类或方法用于处理HTTP请求,并将响应的结果直接返回给客户端,而不需要进行视图渲染
用法:一般直接放在控制器类上也就是我们经常见到的控制层,配合 @RequestMapping 使用
示例:
package com.demo;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
}
- @RequestMapping
作用: @RequestMapping 用于映射web请求(如URL路径)到具体的方法上的注解。
用法:一般直接放在控制器类上或者方法上,标注在类上时,表示类中的所有响应请求的方法都是以该类路径为父路径
示例:
package com.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class DemoController {
}
- @GetMapping、@PostMapping、@PutMapping、@DeleteMapping
作用: 分别用于映射 GET、POST、PUT、DELETE 请求到控制器方法上,
用法:放在处理特定HTTP请求的方法上
示例:
package com.demo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class DemoController {
// GetMapping 使用
@GetMapping("/users/{id}")
public User getUserById(@PathVariable("id") Long id) {
// 实现获取用户信息的逻辑
return new User();
}
// PostMapping 用法
@PostMapping("/add")
public boolean add(@RequestBody User user) {
// 实现添加用户信息的逻辑
return true;
}
// PutMapping 用法
@PutMapping("/edit")
public boolean edit(@RequestBody User user) {
// 实现修改用户信息的逻辑
return true;
}
// DeleteMapping 用法
@DeleteMapping("/delete/{id}")
public boolean delete(@PathVariable("id") Long id) {
// 实现删除用户信息的逻辑
return true;
}
}
- @PathVariable
作用: 用于提取URL中的占位符变量
用法:放在方法参数上例如:@GetMapping("/users/{id}") 通过@PathVariable("id")
示例:
package com.demo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class DemoController {
@GetMapping("/users/{id}")
public User getUserById(@PathVariable("id") Long id) { //@PathVariable("id") 主要是url中取值id
return new User();
}
}
- @RequestBody
作用: @RequestBody
允许将客户端发送的 HTTP 请求体(如 JSON、XML 等格式的数据)映射绑定到一个对象中
用法:在控制器的处理方法中,使用 @RequestBody
标注需要接收 HTTP 请求体的参数
示例:
package com.demo;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class DemoController {
@PostMapping("/add")
public boolean add(@RequestBody User user) { //@RequestBody 对应的是post请求报文体
return true;
}
}
四. 依赖注入注解
- @Autowired
作用: 自动装配 bean,也就是常说的依赖注入,通过这个注解可以将依赖对象注入进来
用法:可用在成员变量、构造方法、设置方法
示例:
package com.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MyService {
/**
* 成员变量通过注入
*/
@Autowired
private MyDemo myDemo;
/**
* 通过构造函数注入
*/
private MyDemo myDemoConstructor;
//通过构造函数注入
@Autowired
MyService(MyDemo myDemo){
this.myDemoConstructor = myDemo;
}
/**
* 通过方法注入
*/
private MyDemo myDemoSet;
//通过方法注入
@Autowired
public void setMyDemo(MyDemo myDemo){
this.myDemoSet = myDemo;
}
}
- @Qualifier
作用: 区分多个 Bean 当存在多个相同类型的Bean时,@Qualifier
注解可以帮助指定具体注入哪一个,通过为Bean提供一个名称,增强了代码的可读性和可维护性
用法:@Qualifier
注解一般都是与@Autowired
注解一起使用,也可与@Primary
注解一起使用
示例:
package com.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class MyService {
/**
* 字段注入方法
*/
@Autowired
@Qualifier("demoName") //注入对象名称demoName,可以通过这个名称获取bean
private MyDemo myDemo1;
private MyDemo myDemo2;
/**
* 构造函数注入
* @param myDemo
*/
@Autowired
public MyService(@Qualifier("myDemoName2") MyDemo myDemo) {
this.myDemo2 = myDemo;
}
private MyDemo myDemo3;
/**
* 通过方法注入
* @param myDemo
*/
@Autowired
public void setDependency(@Qualifier("myDemoName3") MyDemo myDemo) {
this.myDemo3 = myDemo;
}
}
- @
Primary
作用: 优先自动装配,在多个Bean候选者中,标记了@Primary
的Bean将被自动装配,除非使用@Qualifier
指定了其他Bean。在没有明确指定Bean的情况下,@Primary
提供了一种默认的选择
示例:
@Service
@Primary
public class PrimaryService implements MyService {
}
- @Inject
作用: 与@Autowired类似,用于依赖注入,也是通过字段、构造方法、方法进行注入
示例:
package com.demo;
import com.google.inject.Inject;
/**
* 字段注入:直接将依赖注入到类的字段中
*/
public class MyClass01 {
@Inject
private MyDemo myDemo;
}
/**
* 构造函数注入:通过构造函数将依赖传递给类。
*/
class MyClass02 {
private MyDemo myDemo;
@Inject
public MyClass02(MyDemo myDemo) {
this.myDemo = myDemo;
}
}
/**
* 方法注入:在类的某个方法中注入依赖
*/
class MyClass03 {
private MyDemo myDemo;
@Inject
public void setDependency(MyDemo myDemo) {
this.myDemo = myDemo;
}
}
五. 数据访问注解
- @Repository
作用:标识数据访问层组件,用于数据库操作,当一个类被标记为 @Repository
时,Spring 会为该类的所有方法自动应用事务管理。这意味着,如果方法抛出异常,Spring 将自动回滚事务
用法:放在数据访问类上
示例:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface MyRepository extends JpaRepository<MyEntity, Long> {
// 这里可以定义自定义查询方法
List<MyEntity> findBySomeProperty(String someProperty);
}
- @Service
作用:@Service
注解的类通常包含应用程序的核心业务逻辑,@Service
也可以与 Spring 的声明式事务管理结合使用,自动管理事务的边界和传播行为,使用 @Service
注解的类在 Spring 容器中是单例的,即无论多少次请求,Spring 容器都将提供相同的实例
用法:直接在业务逻辑类上使用
示例:
package com.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MyService {
/**
* 成员变量通过注入
*/
@Autowired
private MyDemo myDemo;
}
- @Component
作用:来标识一个类为 Spring 管理的组件。这个注解可以应用于类、接口或枚举类型上。当 Spring 容器启动时,它会扫描带有 @Component
注解的类,并为它们创建一个单例实例(默认情况下)
用法:直接在类上使用
示例:
package com.demo;
import org.springframework.stereotype.Component;
@Component
public class User {
}
- @ConfigurationProperties
作用:用于将配置文件中的属性绑定到一个对象上,通过置文件中的属性值自动映射到 Java 类的字段上,通过 prefix
属性指定配置文件中属性的前缀,所有以该前缀开头的属性都将绑定到该类
用法:直接在类上使用
示例:
package com.demo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* myapp.database-url=jdbc:mysql://localhost:3306/mydb
* myapp.max-connections=50
*/
@ConfigurationProperties(prefix = "myapp") //前缀 myapp
@Component
public class MyProperties {
private String databaseUrl;
private int maxConnections;
// 标准的 getter 和 setter 方法
public String getDatabaseUrl() {
return databaseUrl;
}
public void setDatabaseUrl(String databaseUrl) {
this.databaseUrl = databaseUrl;
}
public int getMaxConnections() {
return maxConnections;
}
public void setMaxConnections(int maxConnections) {
this.maxConnections = maxConnections;
}
}
六. 配置注解
- @Configuration
作用:标记配置类,可以包含@Bean注解的方法,@Configuration
注解的配置类可以提高代码的可读性和可维护性,使得配置更加集中和模块化
用法:放在配置类上
示例:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
- @Bean
作用:用于方法上,表示该方法的返回值是一个bean
用法:放在配置类的方法上
示例:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean(name = "myBean")
public MyBean myBean(DependencyBean dependency) {
MyBean bean = new MyBean();
bean.setDependency(dependency);
return bean;
}
@Bean
public DependencyBean dependencyBean() {
return new DependencyBean();
}
}
- @Import
作用:用于导入其他配置类,使可以将多个配置类组合成一个完整的配置,使得配置更加清晰和易于管理。
用法:放在配置类的方法上
示例:
@Configuration
@Import({DatabaseConfig.class, SecurityConfig.class})
public class AppConfig {
// 这个配置类导入了 DatabaseConfig 和 SecurityConfig 两个配置类
}
@Configuration
class DatabaseConfig {
@Bean
public DataSource dataSource() {
// 配置数据库连接池
return new SomeDataSourceImplementation();
}
}
@Configuration
class SecurityConfig {
@Bean
public AuthenticationManager authenticationManager() {
// 配置认证管理器
return new SomeAuthenticationManagerImplementation();
}
}
- @PropertySource
作用:用于指定配置文件的位置,以指定一个或多个属性文件的路径,Spring 将加载这些文件并使其中的属性可用于注入
用法:放在配置类上
示例:
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource(value = "classpath:app.properties", encoding = "UTF-8")
public class AppConfig {
// 配置类可以访问 app.properties 文件中的属性
}
七. 条件注解
- @Conditional
作用:根据条件判断是否创建bean,@Conditional
注解需要配合一个实现了 Condition
接口的类,Spring 容器在创建 Bean 之前会调用这个条件类的 matches
方法来判断是否满足条件
用法:用在@Bean注解的方法上
示例
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
@Conditional(MyCustomCondition.class)
public MyBean myBean() {
return new MyBean();
}
}
class MyCustomCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 定义条件逻辑,例如检查某个属性是否存在
return context.getEnvironment().containsProperty("my.custom.property");
}
}
- @Profile
作用:指定只有在特定的环境下才会注册的bean,使用 @Profile
可以指定哪些配置文件应该被激活。例如,可以有开发环境的配置和生产环境的配置。
用法:放在类或方法上
示例
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration
public class AppConfig {
@Bean
@Profile("development")
public DataSource developmentDataSource() {
// 返回开发环境的 DataSource
return new DevelopmentDataSource();
}
@Bean
@Profile("production")
public DataSource productionDataSource() {
// 返回生产环境的 DataSource
return new ProductionDataSource();
}
}
八. 测试注解
- @SpringBootTest
作用:用于Spring Boot测试,加载完整的应用上下文,@SpringBootTest
会启动一个 Spring 应用上下文,包括所有的 @Component
、@Service
、@Repository
和 @Controller
等
用法:放在测试类上
示例
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
public class MyApplicationTests {
// 测试代码,例如使用 MockMvc 或其他 Spring 测试工具
}
- @DataJpaTest
作用:@DataJpaTest
仅加载与数据访问层相关的 Bean,如 @Repository
和 @Entity
用法:放在测试类上
示例
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit4.SpringRunner;
@DataJpaTest
public class MyRepositoryTests {
@Autowired
private EntityManager entityManager;
@Autowired
private MyRepository myRepository;
@Test
public void testFindAll() {
List<MyEntity> entities = myRepository.findAll();
assertNotNull(entities);
// 其他断言和测试逻辑
}
}
- @WebMvcTest
作用:用于Spring Boot测试,加载Web MVC的配置,@WebMvcTest
仅加载控制器层相关的 Bean,不加载服务层(Service)、数据访问层(Repository)等其他层的 Bean
用法:放在测试类上
示例
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
@WebMvcTest(MyController.class)
public class MyControllerTests {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetItems() throws Exception {
mockMvc.perform(get("/items"))
.andExpect(status().isOk())
.andExpect(view().name("itemsList"))
// 其他断言和测试逻辑
;
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)