Spring中的常用注解(一)

目录

@RequestMapping

 @PostMapping

 @RequestBody

@Controller 

@ResponseBody 

@RestController 

@Autowired  

@Qualifier 

@Primary  

@Service

@Component

@Bean和@Configuration
----------------

@RequestMapping

@RequestMapping 是 Spring Framework 中用于配置 URL 映射的注解,

@RequestMapping(value = "/hello", method = RequestMethod.GET)
@ResponseBody
public String sayHello() {
    return "Hello, World!";
}

在这个例子中,如果@RequestMapping("/hello") 标注在类上,表示该类中定义的所有方法都将基于 /hello 路径。值得注意的是,Spring 4.3 之后引入了新的组合注解,如 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping 和 @PatchMapping,这些注解是 @RequestMapping 的特化版本,用于简化常见 HTTP 方法的映射配置。例如,@GetMapping("/hello") 等同于 @RequestMapping(value = "/hello", method = RequestMethod.GET)

 @PostMapping

@PostMapping 是一个Spring Framework中用于处理HTTP POST请求的注解,这个注解实际上是 @RequestMapping(method = RequestMethod.POST) 的简写形式,

@PostMapping("/create")
public String createSomthing(@RequestBody MyData data){
    //处理 POST 请求的数据,这里假设 MyData 是一个简单的 POJO(Plain Old Java Object)
    return "Data created successfully!!";
}

在上面的例子中,@PostMapping("/create") 注解表示当收到路径为 /create 的 POST 请求时,应该调用 createSomething 方法。@RequestBody 注解用于将请求体中的 JSON 或 XML 数据绑定到 MyData 类型的参数上。

 @RequestBody

@RequestBody 是 Spring Framework 中的一个注解,它用于将 HTTP 请求的请求体(Request Body)绑定到 Controller 层方法的参数上,当你在 Controller 的方法参数上使用 @RequestBody 注解时,Spring 会使用 HTTP 消息转换器(如 MappingJackson2HttpMessageConverter 对于 JSON)来解析请求体,并将其转换为指定的 Java 类型。

@PostMapping("/api/users")
public User create(@RequestBody User user){
    //在这里,user 对象将会包含从请求体中解析出来的数据
    return user;
}

在这个例子中,当客户端向 /api/users 发送一个包含 JSON 数据的 POST 请求时,Spring 会自动将请求体中的 JSON 数据转换为 User 类型的对象,并将其作为参数传递给 createUser 方法。

@Controller 

@Controller 是 Spring Framework 中的一个注解,它用于标记一个类作为 Controller 类。在 Spring MVC 中,Controller 负责处理由 DispatcherServlet 发送过来的请求,并返回模型和视图。@Controller 注解告诉 Spring,这个类将作为一个 Controller 被使用,并且这个类中的方法可能会处理 HTTP 请求。

@Controller
public class MyController {
 
    @GetMapping("/hello")
    public String sayHello() {
        // 处理逻辑...
        return "helloView"; // 返回视图名称
    }
}

在这个例子中,MyController 类被标记为 @Controller,这意味着 Spring 会将其识别为一个 Controller 类。sayHello 方法使用 @GetMapping("/hello") 注解,表明当接收到路径为 /hello 的 GET 请求时,该方法将被调用。方法返回的字符串 "helloView" 通常对应于一个视图名称,Spring MVC 会使用这个名称来查找并渲染相应的视图。

@ResponseBody 

@ResponseBody 是 Spring Framework 中的一个注解,用于标注在控制器(Controller)类的方法上,指示该方法返回的结果应该直接写入 HTTP 响应体(response body)中,而不是解析为视图(View)。这通常用于实现 RESTful Web 服务,其中控制器方法返回 JSON、XML 或其他媒体类型的数据,而不是 HTML 页面。当你在控制器方法上使用 @ResponseBody 注解时,Spring 会将返回的对象自动转换为 JSON 或 XML(取决于请求的 Accept 头部和配置的消息转换器),并将其作为 HTTP 响应返回给客户端。

@Controller
public class MyRestController {
 
    @GetMapping("/getdata")
    @ResponseBody
    public MyData getData() {
        MyData data = new MyData();
        data.setId(1);
        data.setName("Example Data");
        return data;
    }
 
    // 一个简单的POJO(Plain Old Java Object)
    public static class MyData {
        private int id;
        private String name;
 
        // Getters and setters omitted for brevity
    }
}

在上面的例子中,getData 方法被标注了 @ResponseBody。当用户访问 /getdata 路径时,这个方法会被调用,并且返回的 MyData 对象会自动转换为 JSON(或其他配置的媒体类型),然后发送给客户端。

@RestController 

@RestController 是 Spring Framework 提供的一个注解,用于创建 RESTful Web 服务。这个注解是 @Controller 和 @ResponseBody 的组合体,它告诉 Spring 这是一个控制器,并且该类中的所有方法都默认添加了 @ResponseBody 注解。当你在一个类上使用 @RestController 注解时,这意味着该类是一个控制器,并且它的所有方法都将返回域对象(如 JSON 或 XML 格式的数据),而不是视图。

@RestController
public class MyRestController {
 
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, World!";
    }
 
    @GetMapping("/user")
    public User getUser() {
        User user = new User();
        user.setName("John Doe");
        user.setAge(30);
        return user;
    }

    // 一个简单的POJO(Plain Old Java Object)
    public static class User {
        private String name;
        private int age;
 
        // Getters and setters
    }
}

在上面的示例中,MyRestController 类使用了 @RestController 注解,这表明它是一个 RESTful 控制器。sayHello 方法返回一个简单的字符串,而 getUser 方法返回一个 User 对象。由于类被标记为 @RestController,因此这两个方法都会将返回的数据直接写入 HTTP 响应体,而不是解析为视图。

@Autowired  

@Autowired 是 Spring 框架提供的一个注解,它用于自动装配 Spring 容器中的 bean。通过使用 @Autowired,你可以让 Spring 自动地将依赖项注入到你的类中,而无需显式地通过 new 关键字创建对象或通过其他方式手动获取依赖项。

@Component
public class MyClass {
    @Autowired
    private MyDependency myDependency;
}

@Autowired 默认是按类型进行自动装配的。如果 Spring 容器中存在多个相同类型的 bean,你需要使用 @Primary 注解来指定首选的 bean,或者使用 @Qualifier 注解来精确指定要注入的 bean 的名称。你可以通过设置 @Autowired 的 required 属性为 false 来表示该依赖项是可选的,即如果 Spring 容器中没有匹配的 bean,也不会抛出异常。从 Spring 4.3 开始,如果类只有一个构造函数,那么即使不使用 @Autowired 注解,Spring 也会自动使用该构造函数进行依赖注入。

@Qualifier 

@Qualifier 在Spring框架中,@Qualifier注解主要用于消除自动装配时的歧义。@Qualifier注解的工作原理是,它允许开发者指定一个名称,这个名称应该与想要注入的bean的名称相匹配。这样,当Spring执行自动装配时,它会根据@Qualifier提供的名称来找到对应的bean实例,并将其注入到目标位置。

@Service("userService1")
public class UserServiceImpl1 implements UserService {
    // ...
}
 
@Service("userService2")
public class UserServiceImpl2 implements UserService {
    // ...
}
 
@Component
public class MyComponent {
    
    @Autowired
    @Qualifier("userService1") // 指定注入的名称为"userService1"的bean
    private UserService userService;
    
    // ...
}

在这个例子中,我们有两个实现了UserService接口的bean:UserServiceImpl1和UserServiceImpl2。在MyComponent类中,我们使用@Autowired和@Qualifier("userService1")来明确指定要注入的是名称为userService1的bean实例。需要注意的是,@Qualifier注解通常与@Autowired一起使用,而且它只能用于解决按类型自动装配时的歧义问题。如果你的应用中只有一种类型的bean,或者你已经通过其他方式(如使用@Primary注解)指定了首选的bean,那么你可能不需要使用@Qualifier。

@Primary  

@Primary 在Spring框架中,@Primary注解用于在多个相同类型的bean中指定一个首选的bean。当Spring容器中存在多个相同类型的bean,且没有明确指定注入哪一个时,@Autowired会不知道选择哪一个bean进行注入。此时,如果其中一个bean上标注了@Primary,那么Spring会选择这个标注了@Primary的bean作为默认注入的bean。这个注解通常用在类上,表示当存在多个相同类型的bean时,该类是自动装配的首选。

@Service
public class DefaultUserService implements UserService {
    // ...
}
 
@Primary
@Service
public class SpecializedUserService implements UserService {
    // 这个实现将被优先注入,因为它被标记为@Primary
    // ...
}
 
@Component
public class MyComponent {
    private final UserService userService;
 
    @Autowired
    public MyComponent(UserService userService) {
        this.userService = userService;
    }
}

在这个例子中,DefaultUserService和SpecializedUserService都实现了UserService接口。由于SpecializedUserService上标注了@Primary,所以当MyComponent通过构造函数注入UserService时,Spring会自动选择SpecializedUserService作为注入的bean。

@Service

@Service 在Spring框架中,@Service是一个特殊的注解,用于标识业务逻辑层(Service层)的组件。它是Spring的@Component注解的一个特化。从技术上讲,@Service注解本身与@Component注解的功能是相同的,都是用于定义一个bean,让Spring容器来管理。但是,@Service提供了更明确的语义,表明被标注的类是一个业务逻辑服务。

使用@Service注解的好处是:
自动检测:Spring会自动扫描标注了@Service的类,并将其实例化、初始化,最后注册到Spring IoC容器中。这样,你就可以在其他地方通过自动装配(例如,使用@Autowired注解)来注入这些服务。
明确的语义:@Service注解提供了比@Component更具体的语义,它清楚地表明了该类是业务逻辑服务的一部分。这有助于其他开发者理解代码的结构和用途。
便于管理和维护:通过使用@Service等注解,可以更容易地对应用中的不同组件进行分类和管理。这对于大型项目的维护尤为重要。

@Service
public class UserService {
 
    @Autowired
    private UserRepository userRepository;
 
    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
 
    // 其他业务逻辑方法...
}

在这个例子中,UserService类被标注为@Service,这意味着Spring会将其作为一个bean来管理,并自动处理依赖注入。在这个类中,我们还通过@Autowired注解注入了UserRepository的实例,以便在业务逻辑中使用。

@Component

@Component 在Spring框架中,@Component是一个通用性的注解,用于定义Spring管理的bean。当你将一个类标注为@Component时,Spring会在应用启动时自动扫描并检测到这个类,然后将其注册为一个bean,在Spring的IoC(控制反转)容器中管理。@Component注解通常用于那些不属于@Controller、@Service或@Repository等特定层面的组件。它是一个泛化的概念,表示被标注的类是一个组件,但不具体指明它属于哪一层。使用@Component注解的类通常不需要实现任何特定的接口或继承特定的基类。Spring会为这些类创建实例,并管理它们的生命周期。

@Component
public class MyComponent {
    // 类的实现
}

在这个例子中,MyComponent类被标注为@Component,这意味着Spring会在启动时检测到这个类,并自动创建一个bean实例,将其注册到Spring的IoC容器中。除了@Component,Spring还提供了几个特化的注解,如@Controller、@Service和@Repository,它们本质上都是@Component的特化版本,用于标识特定类型的组件。这些特化注解除了继承@Component的功能外,还提供了额外的语义信息,有助于描述组件的角色。
@Controller:用于标注控制器类,通常与MVC框架一起使用。
@Service:用于标注业务逻辑服务类。
@Repository:用于标注数据访问对象(DAO)类,通常与数据库交互。

@Bean和@Configuration

@Bean 在Spring框架中,@Bean是一个方法级别的注解,主要用于配置类中声明一个Bean。它表示这个方法返回一个对象,这个对象应该被注册到Spring容器中作为Bean进行管理。通过@Bean注解,我们可以自定义Bean的创建和初始化过程,包括指定Bean的名称、作用域、依赖关系等。这个注解通常与@Configuration注解一起使用,后者标记一个类为Spring的配置类。在配置类中,方法名默认作为Bean的ID,但也可以通过@Bean的name属性自定义

@Configuration 在Spring框架中,@Configuration 是一个类级别的注解,它用于定义配置类,这些配置类替代了传统的XML配置文件。使用 @Configuration 注解的类通常包含 @Bean 注解的方法,这些方法用于创建和配置Spring容器中的bean

@Configuration
public class AppConfig {
 
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
 
    @Bean
    public MyAnotherService myAnotherService() {
        return new MyAnotherServiceImpl(myService());
    }
}

在这个例子中,AppConfig 类被标记为 @Configuration,表明它是一个配置类。该类定义了两个 @Bean 方法,分别用于创建 MyService 和 MyAnotherService 的实例。注意,在 myAnotherService() 方法中,我们直接调用了 myService() 方法来获取 MyService 的bean实例。这是因为在 @Configuration 类中,@Bean 方法可以相互调用,并且Spring会确保这些bean是单例的,即使你多次调用 @Bean 方法,也只会得到一个bean实例。

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值