前言
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")) // 其他断言和测试逻辑 ; } }
标签:Spring,Boot,springframework,class,org,import,public,注解 From: https://www.cnblogs.com/ningbeibei/p/18350924