Spring Boot 常见注解的用法和功能

前言

        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"))
               // 其他断言和测试逻辑
        ;
    }
}
  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值