# @SpringBootApplication

@SpringBootApplication 是 Spring Boot 的核心注解,它实际上是一个方便的注解,它包含了 @Configuration、@EnableAutoConfiguration、@ComponentScan 这三个注解的功能。当你在 Spring Boot 项目的主类上添加 @SpringBootApplication 注解时,你告诉 Spring Boot 这是一个 Spring 应用,并启动了自动配置和组件扫描

# @MapperScan

@MapperScan 是 MyBatis-Spring 或 MyBatis-Plus 项目中的一个注解,其主要作用是用于扫描指定包路径下的所有 Mapper 接口,并将它们注册为 Spring 容器中的 Bean,使得这些接口可以被自动实例化并注入到 Spring 容器中

@SpringBootApplication  
@MapperScan("com.example.mapper") // 指定 Mapper 接口所在的包路径  
public class MyApplication {  
    public static void main(String[] args) {  
        SpringApplication.run(MyApplication.class, args);  
    }  
}

# @Resource

@Resource 是 Java EE 中的一个注解,同时也是 Spring 框架中用于依赖注入的一个注解,支持 name 和 type 属性,允许开发者显式指定要注入的 Bean 的名称和类型(默认按名称注入,无指定name时先按名称后按类型查找再注入,指定name时只找该name的bean注入),同样支持在字段、setter方法或者构造函数上注入

# @Autowired

@Autowired 是Spring 框架中的一个核心注解,用于实现自动装配(依赖注入)功能。它可以应用于构造函数、字段(属性)、setter 方法以及方法参数上(默认按类型注入,假如注入接口有多个实现类,需要使用@Qualifier指定bean名称)

@Service  
public class UserServiceImpl implements UserService { 

    //第一种:字段属性注入
    //@Resource
    @Autowired  
    private UserDao userDao; 

    //第二种:构造函数注入
    private UserDao userDao;  
    //@Resource
    @Autowired  
    public UserServiceImpl(UserDao userDao) {  
        this.userDao = userDao;  
    } 

    //第三种:setter注入
    private UserDao userDao; 
    //@Resource
    @Autowired  
    public void setUserDao(UserDao userDao) {  
        this.userDao = userDao;  
    }  
}

# @Component

@Component注解是一个泛化的概念,用于标注一个类作为组件类,并告诉Spring这是一个Spring管理的Bean。@Component及其派生注解(如@Service、@Repository和@Controller)都是用于自动检测类并将其注册为Spring应用上下文中的Bean的。这些注解让Spring能够自动扫描类路径下的这些注解,并将相应的类实例化为Bean,调用时返回新的实例,类似于new

# @Configuration

@Configuration用于定义配置类,这些类包含了Bean的声明(通过@Configuration类中的@Bean方法创建的Bean是单例的,无论你从Spring容器中请求多少次该Bean,Spring都会返回同一个实例)和上下文配置(允许通过Java配置来替代传统的XML配置),注意不能是final类

# @Bean

@Bean注解必须写在方法上,主要作用是将方法的返回值作为一个Bean注册到Spring的IoC(控制反转)容器中,供其他Bean进行依赖注入,一般搭配@Configuration、@Component类使用

  • @Bean注解的方法默认返回单例Bean(即在整个应用程序的生命周期中只有一个实例)。如果你需要多例Bean,请使用@Scope("prototype")注解。
  • @Bean注解的方法不能有任何未实例的参数(除了Spring能够解析的类型,如其他Bean的引用),因为它们是在容器启动时调用的,而不是通过依赖注入调用的。
  • @Bean注解的方法可以是public、protected、private或默认访问修饰符(即包级私有),但通常建议使用public以提高可读性和可维护性
@Component  
public class MyComponent { 

}

@Configuration  
public class AppConfig {  
  
    //无参 
    @Bean  
    public Dependency dependency() {  
        return new Dependency();  
    }

    //有参,但必须spring能解析,比如引入上方的bean
    @Bean  
    public MyBean myBean(Dependency dependency) {  
        MyBean myBean = new MyBean();  
        myBean.setDependency(dependency);  
        return myBean;  
    }  
}

# @Value

@Value("name")直接将name赋值给属性
@Value("${name}")从properties文件中找对应name的值赋值
@Value("#{name}")spring会把name当做beanName,从容器中找对应bean注入

public class MyBean {
    @Value("Hello World")
    private String greeting_1;

    // application.properties文件
    // myapp.greeting=Hello Spring

    @Value("${myapp.greeting}")
    private String greeting_2;

    @Value("#{${myapp.greeting}}")
    private String greeting_3;
}

# @Repository

@Repository注解是Spring框架提供的一个核心注解,用于将数据访问层的组件(如DAO层的类)标记为Spring容器中的一个Bean。这样做有几个好处:

  • 自动注册:被@Repository注解的类会被Spring容器自动识别并注册为Bean,从而可以进行依赖注入等操作。
  • 异常转换:Spring可以自动将@Repository注解的类抛出的数据访问异常(如SQLException)转换为Spring的DataAccessException异常,这是一种更高级别的、不依赖于特定数据访问技术的异常类型,有助于简化异常处理。

# @Service

@Service 注解是 Spring 提供的一种特殊组件扫描注解,用于告诉 Spring 容器,被注解的类是一个服务类。

  • 组件扫描:为了使 @Service 注解生效,需要通过在配置类上使用 @ComponentScan 注解来扫描(@SpringBootApplication已包含)
  • Bean 名称:默认情况下,Spring 会将被 @Service 注解的类的简单类名(首字母小写)作为 Bean 的名称。但也可以通过 @Service("beanName") 的方式来指定 Bean 的名称。
  • 事务管理:当需要在服务层方法中使用事务管理时,可以在该方法上添加 @Transactional 注解。Spring 会根据配置自动管理事务的开启、提交和回滚。

# @Mapper

@Mapper注解通常与MyBatis这样的持久层框架一起使用。MyBatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。@Mapper注解用于将接口标记为MyBatis的Mapper接口,这样MyBatis就可以通过接口中的方法定义来找到对应的SQL语句并执行它们。

// 数据访问层
@Repository
public interface UserRepository {
    User findById(Long id);
}

// 业务逻辑层
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    public User getUserById(Long id) {
        return userRepository.findById(id);
    }
}

// MyBatis映射器
@Mapper
public interface UserMapper {
    User selectUserById(Long id);
}

# @Controller

@Controller 是 Spring Framework 中的一个核心注解,它用于定义 MVC(Model-View-Controller)架构中的控制器(Controller)组件。

  • 组件识别:@Controller 注解用于告诉 Spring 容器,被注解的类是一个 MVC 控制器。这样,Spring 就可以自动扫描到这些类,并在启动时将它们注册为 Spring MVC 控制器 Bean。
  • 请求映射:在控制器类中,通常会使用 @RequestMapping 或其派生注解(如 @GetMapping、@PostMapping 等)来映射具体的请求 URL 到控制器的方法上。这些注解定义了请求的 URL 模式、HTTP 方法(如 GET、POST 等)以及请求和响应的媒体类型等。
  • 模型数据:控制器方法可以接收请求参数,并处理业务逻辑。处理完成后,可以通过 Model 或 ModelAndView 对象将模型数据传递给视图。
  • 视图解析:控制器方法的返回值通常是一个字符串,表示视图的名称,或者是一个 ModelAndView 对象,包含了视图名称和模型数据。Spring MVC 会根据视图解析器的配置,将视图名称解析为具体的视图模板,并使用模型数据进行渲染。

# @ResponseBody

@ResponseBody 是 Spring MVC 中的一个注解,它用于将控制器(Controller)方法的返回值转换为 JSON、XML 或其他配置的格式,并写入到 HTTP 响应的 body 部分,而不是解析为视图名称并渲染视图。(可以单独用在方法上响应返回值)

# @RestController

@RestController 是 Spring Framework 4.0 引入的一个注解,它是 @Controller 和 @ResponseBody 的组合注解,用于控制器类中的方法直接返回JSON、XML 等数据。

@Controller
@ResponseBody
//或者直接@RestController代替上面两个
public class MyController {  
  
    @GetMapping("/someData")  
    @ResponseBody 
    public String getData() {  
        return "Some data here";  
    }  
  
}

# @RequestMapping

@RequestMapping 是 Spring MVC 中用于处理请求地址映射的通用注解。它可以用于类或方法上。当用于类级别时,它表示该类中的所有响应请求的方法都是以该注解指定的路径为父路径。@RequestMapping 可以包含多个属性,如 value、method、params、headers 等,用于进一步细化请求映射的条件。

  • @GetMapping:用于处理 HTTP GET 请求。它是 @RequestMapping(method = RequestMethod.GET) 的快捷方式。
  • @PostMapping:用于处理 HTTP POST 请求。它是 @RequestMapping(method = RequestMethod.POST) 的快捷方式。
  • @PutMapping:用于处理 HTTP PUT 请求。它是 @RequestMapping(method = RequestMethod.PUT) 的快捷方式。
  • @DeleteMapping:用于处理 HTTP DELETE 请求。它是 @RequestMapping(method = RequestMethod.DELETE) 的快捷方式。

# @PathVariable

@PathVariable 是 Spring MVC 中用于将 URL 模板变量绑定到你控制器处理器方法参数上的一个注解。当你在 URL 路径中使用动态段时,@PathVariable 可以让你从这些段中提取值,并将它们作为控制器方法的参数。

  • @PathVariable 不仅可以用于字符串类型,还可以用于其他类型,比如整数(int、Integer)、长整数(long、Long)等,只要 URL 模板变量的值可以转换为这些类型。
  • 当处理多个 @PathVariable 时,你需要在 URL 模板中为每个变量指定一个唯一的名称,并在控制器方法中使用相应的参数来接收它们。
@RestController  
public class UserController {  
  
    //假如请求是这样的 /users/1
    @GetMapping("/users/{userId}")  
    public User getUserById(@PathVariable("userId") String userId) {  
        // 假设这里有一个方法可以根据userId获取User对象  
        // return userService.findUserById(userId);  
    } 
}

# @RequestParam

@RequestParam用于将请求参数(即URL中的查询参数,或者是表单提交的参数,再或者文件上传)绑定到你的控制器方法参数上。这个注解通常用于处理GET请求或POST请求中的表单数据。

//假如请求是这样的 /search?query=博客
@GetMapping("/search")  
public String search(@RequestParam String query) {  
    return query;  
}

# @RequestBody

@RequestBody注解用于将HTTP请求的正文(Body)绑定到方法的参数上。这通常用于处理非表单数据,比如JSON或XML。当使用@RequestBody时,Spring会使用合适的HTTP消息转换器(如Jackson用于JSON)来读取请求体,并将请求体中的内容绑定到指定的对象上。

//假设客户端发送了一个JSON请求到/user,请求体内容如下:
{  
  "name": "lzs博客",  
  "email": "lzs@example.com"  
}

@PostMapping("/user")  
public String createUser(@RequestBody User user) {  
    return "ok" ;  
}

表单数据提交的一些常用Content-Type类型

  • application/x-www-form-urlencoded:这是表单数据提交时默认的编码类型,表单数据被编码为key/value格式发送到服务器。
  • multipart/form-data:表单中进行文件上传时就需要使用该格式。
  • application/json:JSON数据格式

# @ModelAttribute

@ModelAttribute 是 Spring MVC 中的一个注解,主要被用于在控制器(Controller)的方法参数或方法上,以提供对模型属性的访问和绑定。

  • 绑定请求参数到模型属性:当用于方法参数时,@ModelAttribute 可以将请求参数(如查询字符串、表单数据等)绑定到 Java 对象(即模型属性)的字段上。这通常用于处理表单提交,其中表单的输入字段与 Java 对象的属性相对应。
@PostMapping("/user")  
public String createUser(@ModelAttribute User user) {  
    return "ok";  
}

  • 作为方法的返回值:@ModelAttribute 也可以用于注解一个非请求处理方法,该方法将在控制器类的其他请求处理方法之前执行,对模型(Model)进行预处理或添加一些必要的属性,用于控制器之间共享数据,或者在渲染视图之前准备数据
@Controller  
public class MyController {  
  
    // 这个方法会在其他请求处理方法之前执行  
    @ModelAttribute  
    public void addAttributes(Model model) {  
        // 向模型中添加一些共享数据  
        model.addAttribute("currentTime", LocalDateTime.now());  
    }

    // 这个方法会在其他请求处理方法之前执行,并将返回值添加到模型中  
    @ModelAttribute  
    public User populateUser() {  
        User user = new User();  
        // 设置一些默认值或进行其他初始化  
        user.setName("默认用户");  
        return user; // 返回值被添加到模型中,默认键名为"user"  
    } 
  
    // 处理GET请求的方法  
    @GetMapping("/showForm")  
    public String showForm(@ModelAttribute("user") User user) {
        // 此时user对象已经包含了populateUser方法中的默认值和表单提交的值(重复会覆盖name)
        System.out.println(user.getName());
        // 由于addAttributes方法的存在,类中每个请求都会有一个名为"currentTime"的视图属性  
        // 结果就是formPage视图中也可以访问这个属性  
        return "formPage";  
    }  
  
}