springboot核心注解

   Springboot提供的注解,如@Controller(用于表现层)、@Service (用于业务层) 、@Repository(用于数据访问层)、@Component(更通用的组件注解,可以用在任何层)。这些注解都是 @Component 的特化形式,它们之间唯一的区别是所标注的类在应用程序中所扮演的角色。

@Component

    @Component 是 Spring 框架中的一个核心注解,它用于标注一个类,表示该类是一个 Spring 组件,即这个类会被 Spring 容器管理,其生命周期也将由 Spring 容器来控制。通过 @Component 注解的类,Spring 会自动检测到并在应用启动时将其实例化、组装成一个 Bean,然后存储到 Spring 容器中,以便后续在其他地方通过依赖注入(DI)的方式使用。

使用场景

  1. 普通的 Spring Bean:当你有一个普通的 Java 类,并且希望 Spring 容器能够管理它时,就可以使用 @Component 注解。
    组件化开发:在基于 Spring 的大型应用中,通常会将应用拆分成多个组件(或模块),每个组件包含多个相关的类。使用 @Component 注解可以方便地将这些类标识为 Spring 组件,从而更容易地进行组件化开发和管理。
  2. 配合其他注解:@Component 注解可以与其他注解(如 @Repository、@Service、@Controller)一起使用,这些注解是 @Component 的特化形式,用于表示不同类型的组件(如数据访问层、服务层、控制层等)。但在某些情况下,如果你不需要明确区分组件的类型,或者你的类不属于上述任何一种特定类型,那么使用 @Component 注解就足够了。
    示例
import org.springframework.stereotype.Component;  
  
@Component  
public class MyComponent {  
    // 类的实现...  
}

   在这个例子中,MyComponent 类被 @Component 注解标注,表示它是一个 Spring 组件。Spring 容器在启动时会自动检测到这个类,并将其实例化为一个 Bean,然后存储到 Spring 容器中。之后,你就可以在其他地方通过依赖注入的方式使用这个 Bean 了。

注意事项

  1. 使用 @Component 注解时,Spring 容器默认会按照类的简单名称(首字母小写)作为 Bean 的 ID。但是,你也可以通过 @Component 注解的 value 属性或 @Bean 注解的 name 属性来自定义 Bean 的 ID。
  2. 在 Spring Boot 应用中,由于自动配置和组件扫描的引入,使得使用 @Component 注解变得更加简单和方便。但是,也需要注意不要过度使用注解,以免导致 Spring 容器中存在过多的 Bean,从而增加应用的复杂性和启动时间。
  3. 当你需要在 Spring 容器外部(即不通过 Spring 容器来管理)创建和使用一个类的实例时,就不应该在该类上使用 @Component 注解。
@RestController

使用场景
    当你需要开发一个 RESTful API,并且希望所有的方法都返回 JSON 或 XML 等格式的数据时,使用 @RestController 注解是非常方便的。这个注解适用于那些主要提供数据而非HTML页面的Web服务。
示例

import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
@RestController  
public class GreetingController {  
  
    @GetMapping("/greeting")  
    public String greeting() {  
        return "Hello, World!";  
    }  
}
@Service

使用场景
    当你需要定义一个类来处理应用程序的业务逻辑时,可以使用 @Service 注解。
    @Service 注解使得 Spring 容器能够识别并管理该类的一个或多个实例(Bean),从而可以在需要时自动注入到其他组件中。
    它还允许你通过 Spring 的 AOP(面向切面编程)功能来增强业务逻辑,比如添加事务管理、日志记录等。
示例
下面是一个使用 @Service 注解的简单示例:

import org.springframework.stereotype.Service;  
  
@Service  
public class UserService {  
  
    // 假设这里有一个 UserRepository 依赖,用于访问数据库  
  
    public User findUserById(Long id) {  
        // 这里是业务逻辑,比如从数据库查询用户信息  
        // ...  
        // 返回一个模拟的用户对象  
        return new User(id, "John Doe", "john.doe@example.com");  
    }  
  
    // 其他业务方法...  
}
@Repository

使用场景

  1. 当你需要定义一个类来封装对数据库的访问逻辑时,可以使用 @Repository 注解。
  2. @Repository 注解使得 Spring 容器能够识别并管理该类的一个或多个实例(Bean),从而可以在需要时自动注入到其他组件中。
  3. 它还允许 Spring 框架将原生访问数据库的异常(如 SQLException)转换为 Spring 定义的异常(如 DataAccessException),这样可以使异常处理更加一致和方便。

示例
下面是一个使用 @Repository 注解的简单示例:

import org.springframework.stereotype.Repository;  
import javax.persistence.EntityManager;  
import javax.persistence.PersistenceContext;  
  
@Repository  
public class UserRepository {  
  
    @PersistenceContext  
    private EntityManager entityManager;  
  
    public User findUserById(Long id) {  
        // 使用 JPA EntityManager 来查询用户  
        return entityManager.find(User.class, id);  
    }  
  
    // 其他数据访问方法...  
}
@Autowired

使用场景
    当你需要将 Spring 容器中的 Bean 注入到一个类的字段、构造函数或配置方法中时,可以使用 @Autowired 注解。
    @Autowired 注解通常与 @Component、@Service、@Repository 或 @Controller 等注解一起使用,这些注解将类标记为 Spring 容器中的 Bean。
示例
   下面是一个使用 @Autowired 注解的简单示例:
   在这个例子中,UserService 类的构造函数被 @Autowired 注解标记,Spring 容器会自动注入一个 UserRepository 类型的 Bean 作为构造函数的参数。

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Service;  
  
@Service  
public class UserService {  
  
    private final UserRepository userRepository;  
  
    @Autowired  
    public UserService(UserRepository userRepository) {  
        this.userRepository = userRepository;  
    }  
  
    public User findUserById(Long id) {  
        return userRepository.findUserById(id);  
    }  
  
    // 其他方法...  
}

注意事项

  1. 如果 Spring 容器中只有一个与注入点相匹配的 Bean,那么 @Autowired 注解就可以正常工作。如果有多个匹配的 Bean,Spring 会抛出异常,除非你指定了 @Qualifier 注解来进一步细化选择。
  2. 从 Spring 4.3 开始,如果你在一个类中只使用了一个构造函数,并且该构造函数的所有参数都适合自动注入,那么即使你没有在构造函数上使用 @Autowired 注解,Spring 也会自动注入这些参数。这被称为“构造函数注入的隐式自动检测”。
  3. @Autowired 注解也可以用在配置方法上,以实现基于 Java 的配置。但是,在大多数情况下,它更常用于字段注入和构造函数注入。
  4. 虽然 @Autowired 注解简化了依赖注入的过程,但过度使用它可能会使代码难以理解和测试。因此,建议仅在确实需要自动注入依赖项时才使用它,并考虑使用其他依赖注入技术(如构造函数注入)来增强代码的清晰度和可测试性。
@RequestMapping

基本用法
   @RequestMapping 可以注解在类级别或方法级别上。
   类级别:当注解在类级别时,它定义了该类中所有方法的基础 URL。类级别的 @RequestMapping 定义的 URL 会作为方法级别 @RequestMapping 定义的 URL 的前缀。
   方法级别:当注解在方法级别时,它直接定义了处理请求的 URL 以及可选的请求方法(如 GET、POST)和请求参数等。
示例
类级别:

@Controller  
@RequestMapping("/users")  
public class UserController {  
  
    // 方法级别的 @RequestMapping 会继承类级别的 "/users"  
  
}

方法级别:

@Controller  
public class UserController {  
  
    @RequestMapping(value = "/{userId}", method = RequestMethod.GET)  
    public String getUser(@PathVariable("userId") Long userId, Model model) {  
        // 处理 GET 请求,并返回视图名或逻辑视图名  
        return "user";  
    }  
  
    @RequestMapping(value = "/new", method = RequestMethod.GET)  
    public String newUserForm(Model model) {  
        // 处理 GET 请求,返回添加新用户的表单页面  
        return "userForm";  
    }  
  
    @RequestMapping(value = "/new", method = RequestMethod.POST)  
    public String createUser(@ModelAttribute User user, Model model) {  
        // 处理 POST 请求,保存用户信息  
        return "redirect:/users/" + user.getId();  
    }  
}

属性
@RequestMapping 注解有多个属性,其中最常用的包括:
valuepath:用于指定请求的 URL 路径。
method:用于指定请求的方法类型(如 GET、POST)。
params:用于指定请求必须包含的参数。
headers:用于指定请求必须包含的 HTTP 头信息。
consumes:指定处理请求的提交内容类型(Content-Type),如 application/json。
produces:指定返回的内容类型,如 text/html。

替代注解
从 Spring 4.3 开始,Spring MVC 引入了更具体的注解来替代 @RequestMapping,以提供更清晰的语义,包括:
@GetMapping:等价于 @RequestMapping(method = RequestMethod.GET)。
@PostMapping:等价于 @RequestMapping(method = RequestMethod.POST)。
@PutMapping:等价于 @RequestMapping(method = RequestMethod.PUT)。
@DeleteMapping:等价于 @RequestMapping(method = RequestMethod.DELETE)。
@PatchMapping:等价于 @RequestMapping(method = RequestMethod.PATCH),用于对资源进行部分修改。
这些注解使得代码更加简洁易读。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值