@Slf4j
@GetMapping
@GetMapping、@PostMapping、@PutMapping、@DeleteMapping:简化@RequestMapping的GET、POST、PUT和DELETE请求。
@RequestMapping
@RequestMapping:用于映射HTTP请求路径到Controller的处理方法。
@Component
在 Spring 框架里,@Component 是一个通用的注解,它可把类标记为 Spring Bean,这意味着 Spring 会在应用启动时扫描这些类,并将它们注册到应用的上下文里。在你的代码中,MyService 类和 MyController 类都被 @Component 注解标记,所以 Spring 会把这两个类当作 Bean 来管理。
@Autowired
此注解的作用是实现依赖注入。当一个类的属性被 @Autowired 注解标记时,Spring 会自动在应用上下文中查找与该属性类型匹配的 Bean,并把它注入到这个属性里。在你的代码中,MyController 类里的 myService 属性被 @Autowired 注解标记,Spring 就会在应用上下文中找到 MyService 类型的 Bean,然后把它注入到 myController 实例的 myService 属性里。
autowired和手动创建的区别
虽然从效果上看,在 MyController 中通过 @Autowired 注入 MyService 类型的 Bean 和在 MyController 里新建一个 MyService 对象都能让 MyController 使用 MyService 的功能,但二者存在本质区别。下面从多个方面进行分析: 不同点
- 对象创建方式 手动新建对象:在 MyController 里手动创建 MyService 对象,需要使用 new 关键字,例如:
public class MyController {
private MyService myService = new MyService();
// 其他代码
}
这种方式下,对象的创建和管理由开发者自己负责,每次创建都会生成一个新的实例。 依赖注入:使用 @Autowired 注解时,Spring 容器负责创建和管理 MyService 类型的 Bean。Spring 会在应用启动时,根据配置(如组件扫描、Java 配置或 XML 配置)创建 MyService 的实例,并将其存储在应用上下文中。当 MyController 需要使用 MyService 时,Spring 会从应用上下文中取出已创建好的 MyService 实例注入到 MyController 中。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyController {
@Autowired
private MyService myService;
// 其他代码
}
- 依赖管理和耦合度 手动新建对象:会使 MyController 与 MyService 紧密耦合。如果 MyService 的构造函数发生变化,或者需要使用 MyService 的不同实现类,就需要修改 MyController 的代码。 依赖注入:能降低 MyController 与 MyService 之间的耦合度。MyController 只依赖于 MyService 的接口或抽象类型,具体的实现类由 Spring 容器在运行时注入。这样,当需要更换 MyService 的实现类时,只需修改 Spring 配置,而无需修改 MyController 的代码。
- 生命周期管理 手动新建对象:对象的生命周期由 MyController 控制。当 MyController 实例被销毁时,手动创建的 MyService 对象也会随之销毁。 依赖注入:Spring 容器负责管理 MyService 实例的生命周期。Spring 会在合适的时机创建、初始化和销毁 MyService 实例,例如在应用启动时创建,在应用关闭时销毁。
- 单例性 手动新建对象:每次使用 new 关键字创建对象时,都会得到一个新的实例。 依赖注入:在 Spring 中,默认情况下,Bean 的作用域是单例(Singleton),即整个应用中只有一个 MyService 实例。这个单例实例会被多个 MyController 实例共享。
回复