小白理解@Service,@Component, @Controller, @Repository, @Autowired等注入

相关内容来自腾讯元宝, 作者也属于入门,仅做参考

入门级别的小白已经根据视频跑起来项目, 也能根据例子进行增删改查的操作, 可是总有些疑问, 我们不都是用new 创建一个实例对象, 然后使用他们的方法和属性,但springboot里有了 @Autowired就行了,
why?
后面弄明白了, 现在看菜鸟来理解

  1. @Service/@Component/@Controller/@Repository加在类上​ → 让Spring创建一个Bean实例放入容器
  2. @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启动时:

  1. 扫描所有类
  2. 发现带 @Service/@Component 等的类
  3. 创建实例(调用构造方法)
  4. 处理依赖注入(如果有@Autowired的字段)
  5. 执行初始化方法(如果有@PostConstruct)
  6. 放入Spring容器(一个ConcurrentHashMap)

Spring看到@Autowired:

  1. 获取字段类型:UserService
  2. 在容器中查找UserService类型的Bean
  3. 找到:beanContainer.get(“userService”)
  4. 反射设置字段值: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”)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值