今天遇到一个问题,就是在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.如果有 @PostConstruct 或 InitializingBean,执行初始化方法
4.执行 @PreDestroy 或 DisposableBean 中定义的销毁逻辑。
我们平时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;


448

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



