注入和对象实例
1. 注入
- 在编程领域,注入(Injection)是一种设计模式,它属于控制反转(Inversion of Control, IoC)的一种形式。注入的目的是减少程序中各个组件之间的耦合度,使得组件更加独立、灵活和可重用。
- 注入的核心思想是:组件不自己创建它依赖的对象,而是从外部获取这些对象。
1.1. 依赖注入
- 我们一般说的注入就是指依赖注入;
- 依赖(Dependency):一个类使用另一个类的实例来完成某些任务,称为依赖。例如,类A依赖于类B来完成某些功能,类B就是类A的依赖;
- 注入(Injection):将依赖传递给使用它的对象的过程。在注入之后,接收方才能够调用该依赖;
1.1.1. 常见的注入形式
- 组件:是指系统中的一个可替换的、独立的、模块化的单元;一个组件可能由一个或多个类(实体类)组成,这些类共同实现组件的功能;个人理解,可以直接解释为一个.class文件;
- 依赖注入(Dependency Injection, DI);依赖注入是指组件的依赖关系由外部传入,而不是组件自己创建。依赖注入可以进一步细分为:
- 构造器注入:通过构造器传递依赖对象。
- 设置器注入:通过设置器方法(如setter方法)传递依赖对象。
- 接口注入:通过接口传递依赖对象。
- 字段注入:直接在字段上注入依赖对象。
1.1.1.1. 构造器注入
@Component
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
1.1.1.2. 设置器注入
- 通过设置器方法(setter)将依赖注入bean。
@Component
public class UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
1.1.1.3. 字段注入
@Component
public class UserService {
@Autowired
private UserRepository userRepository;
}
2. 声明和创建对象
- 声明指向“由类所创建的对象”的变量。
- 用new创建新的对象,并指派给先前所创建的变量
Person p1;
p1 = new Person();
3. 多线程构造,如何传递注入方式声明的对象实例
- 使用多线程的时候,需要通过构造方法将对象实例传递到线程内部;
3.1. 原因
- 确保线程安全:多线程环境下,共享对象可能会导致线程安全问题。通过构造方法传递对象实例,可以确保每个线程都有自己的对象副本,从而避免多个线程同时修改同一个对象导致的竞态条件;
- 避免Spring注入问题:在Spring框架中,非由Spring容器直接管理的线程(例如,通过new Thread()或Thread.start()手动创建的线程)无法直接使用Spring的依赖注入功能。通过构造方法传递对象实例,可以确保线程能够访问到Spring管理的bean;