目录
@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")@ResponseBodypublic 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 {@Autowiredprivate 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"的beanprivate 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;@Autowiredpublic 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 {@Autowiredprivate 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 {@Beanpublic MyService myService() {return new MyServiceImpl();}@Beanpublic MyAnotherService myAnotherService() {return new MyAnotherServiceImpl(myService());}
}
在这个例子中,AppConfig 类被标记为 @Configuration,表明它是一个配置类。该类定义了两个 @Bean 方法,分别用于创建 MyService 和 MyAnotherService 的实例。注意,在 myAnotherService() 方法中,我们直接调用了 myService() 方法来获取 MyService 的bean实例。这是因为在 @Configuration 类中,@Bean 方法可以相互调用,并且Spring会确保这些bean是单例的,即使你多次调用 @Bean 方法,也只会得到一个bean实例。