相关内容来自腾讯元宝, 作者也属于入门,仅做参考
入门级别的小白已经根据视频跑起来项目, 也能根据例子进行增删改查的操作, 可是总有些疑问, 我们不都是用new 创建一个实例对象, 然后使用他们的方法和属性,但springboot里有了 @Autowired就行了,
why?
后面弄明白了, 现在看菜鸟来理解
- @Service/@Component/@Controller/@Repository加在类上 → 让Spring创建一个Bean实例放入容器
- @Autowired加在字段/构造器/方法上 → 从容器中取出已有的Bean实例并赋值
如何大白话解释
@Service,@Component,@Controller 只有语义的区别,其实他们的作用都是一样的,就是说可以混用?但没人这么弄, 大家约定俗成: 服务层@Service, 控制层@Controller ,存储层@Repository, 其他的@Component,
他们的作用是什么?
创建Bean实例, 特别重要, 是创建一个实例, 就相当于new了,并相当于全局存储了起来, 给后面@Autowired等注解使用
// 1. Spring扫描到这个类
@Service // ← 告诉Spring:"请创建我的实例并管理起来"
public class UserService {
public void doSomething() {
System.out.println("处理用户业务");
}
}
// 2. Spring在启动时会:
// - 创建 UserService 的实例(相当于 new UserService())
// - 把这个实例放入"Spring容器"(一个Map结构)
// - Bean的名字默认是类名首字母小写:userService
当运行时,spring 会扫码全局代码.Spring:“请创建我的实例并管理起来”
new UserService() 有一个userService的对象创建成功,等我们赋值调用
这里有个专有的名字 Bean实例
怎么用呢? @Autowired 来使用
@Controller
public class UserController {
// 3. 这里不是"创建实例",而是"取出已有实例"
@Autowired // ← 告诉Spring:"请把容器里的userService实例拿给我"
private UserService userService; // 这里userService已经是容器里的实例
public void handleRequest() {
userService.doSomething(); // 可以直接使用
}
}
使用注解@Autowired后就相当于赋值了
UserService userService = new new UserService();
例子:
// Spring容器就像一个超市
// 货架上已经摆好了商品(Bean实例)
// 厂家(你的类)生产商品
@Service // ← 商品上架:把UserService实例放到"Spring货架"上
public class UserService { /* ... */ }
@Component // ← 商品上架:把OrderService实例放到"Spring货架"上
public class OrderService { /* ... */ }
// 顾客(其他类)来取商品
@Controller
public class UserController {
@Autowired // ← 从货架上取商品:取出UserService实例
private UserService userService; // 拿到手了,可以直接用
@Autowired // ← 从货架上取商品:取出OrderService实例
private OrderService orderService;
}
整个流程 -->
Spring启动时:
- 扫描所有类
- 发现带 @Service/@Component 等的类
- 创建实例(调用构造方法)
- 处理依赖注入(如果有@Autowired的字段)
- 执行初始化方法(如果有@PostConstruct)
- 放入Spring容器(一个ConcurrentHashMap)
Spring看到@Autowired:
- 获取字段类型:UserService
- 在容器中查找UserService类型的Bean
- 找到:beanContainer.get(“userService”)
- 反射设置字段值:field.set(this, userService)
继续理解
其实不仅是类的属性可以加 属性,构造器,方法等都可以用注解@Autowired修饰
@Component
public class Example {
// 方式1:字段注入
@Autowired
private UserService userService;
// 方式2:构造器注入(Spring推荐)
private final OrderService orderService;
// 这里@Autowired告诉Spring:"调用这个构造器,并传入OrderService实例"
@Autowired
public Example(OrderService orderService) {
this.orderService = orderService; // 赋值
}
// 方式3:setter方法注入
private ProductService productService;
// 这里@Autowired告诉Spring:"调用这个方法,并传入ProductService实例"
@Autowired
public void setProductService(ProductService productService) {
this.productService = productService; // 赋值
}
}
上面的说法不完全,完整的说法是
@Autowired能工作的前提是:当前类本身必须是Spring管理的Bean!
还记得 @Component 这个注解么, 他和其他的似乎不一样, 不在什么控制层,服务层里面
这是因为他是给普通的类用的, 普通类用了他,就能被Spring管理,里面也就可以使用@Autowired.(同时他自己也生成了Bean对象)
✅ @Autowired可以用在:
任何被Spring管理的Bean内部(@Component、@Service、@Controller、@Repository、@Configuration等)
@Bean方法的参数上
构造器、setter方法、普通方法上
❌ @Autowired不能用在:
普通的Java类(没有Spring注解的类)
静态字段上
final字段上(除非用构造器注入)
修的吗得, 不对啊
springboot里没有@Controller
有的,兄弟有的
@Controller + @ResponseBody = @RestController
这里有一段遥远的故事,关于jsp的故事
下期继续
@Resource(name = “captchaProducer”)
1万+

被折叠的 条评论
为什么被折叠?



