Spring 注入的几种方式以及含义原理

今天遇到一个问题,就是在websocket中无法调用我通过@Autowired 字段注入的对象,然后回头恶补了一下Spring相关姿势

首先先解释一些基础定义

1.Spring容器和bean是什么

        spring的核心是它的ioc容器,我们一直都在说控制反转容器Ioc到底是怎么控制反转的,平时我们创建一个对象用到最多的就是new对象,这是由我们程序员来操作的,但是有了spring后,这个创建对象的过程可以由我们程序员转变为了spring。而bean其实就是由spring管理的对象,被容器实例化管理的一个java对象。

spring容器就是管理对象的容器,就是管理bean的容器,我们之前所说的bean生命周期(实例化,初始化,销毁)都由spring容器来操作了。

在程序启动的时候容器就会创建所有所需要的对象(根据配置或者注解识别),的示例,然后去看看哪里需要注入依赖就注入到哪里(容器会分析 构造器或字段,哪里需要哪里注入)。

Spring 容器能够直接实例化接口的原因是 Spring 使用了代理模式,特别是 JDK 动态代理CGLIB 代理,来为接口生成实例或为类生成代理类。

2.bean的生命周期

简单说一下bean的生命周期

1容器根据定义先去创建对象,也就是实例化对象。

2.然后就是注入依赖,我们通常用的其实就是@Autowired来进行注入依赖的。

3.如果有 @PostConstructInitializingBean,执行初始化方法

4.执行 @PreDestroyDisposableBean 中定义的销毁逻辑。

我们平时new完对象后肯定是不会销毁的,但是要是对象量很大的话,当我们用完之后不再使用的时候,他就变成了不可达对象,这个时候就需要等待JVM垃圾回收了,但是JVM垃圾回收也是有触发条件的,就可能造成内存泄漏。

3.注入依赖的条件

注入依赖其实也是有条件的,当a类和b类都被spring容器管理的时候,我们才能用所谓的字段注入,构造器注入才有效,不然直接就是一个空指针。。。

当我们所需要的实例化对象,都被容器管理时,也就是我们那些注解@Component、@Mapper、@Service等等那些,都是将对象实例化后放到容器中,也只有他们在同一个容器中,才可以互相注入依赖。

4.注入依赖的方式

1.标准构造器注入

@Service
public class OrderService {

    private final OrderRepository orderRepository;

    // 只需要一个构造器,Spring 会自动注入
    @Autowired
    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
}

//如果类中有多个构造器,Spring 会根据所提供的参数类型来选择合适的构造器进行注入。需要使用@Autowired 来标注希望 Spring 使用的构造器。

@Service
public class OrderService {

    private final OrderRepository orderRepository;
    private final PaymentService paymentService;

    // 第一个构造器
    @Autowired
    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
        this.paymentService = null;
    }

    // 第二个构造器,注入更多的依赖
    @Autowired
    public OrderService(OrderRepository orderRepository, PaymentService paymentService) {
        this.orderRepository = orderRepository;
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值