1. 差异
@Autowired
注解是 Spring 框架中用来自动装配 Bean 的注解
当一个类中使用 @Autowired
注解时,Spring 容器会在初始化这个类的时候自动装配相应的 Bean,而不需要手动去创建对象
而使用 new 关键字来构建对象是传统的 Java 对象创建方式,即通过手动调用构造函数来创建对象
这种方式不会触发 Spring 的自动装配机制,所以即使已经在 Spring 的配置文件中定义了相应的 Bean,也不会被注入,而且当通过 new 关键字创建对象时,这个对象中使用 @Autowired
注解的成员变量也不会被自动注入,因此它们会保持为 null。
所以,主要的区别在于:
@Autowired
注解是 Spring 提供的一种依赖注入的方式,通过它可以让 Spring 容器自动装配需要的 Bean,而不需要手动创建对象- 使用 new 关键字创建对象是传统的 Java 对象创建方式,不会触发 Spring 的自动装配机制,因此无法实现依赖注入
2. 场景
2.1 @Autowired
@Autowired
注解是 Spring 框架中的一个注解,用于自动装配 Bean- 当类中的某个属性使用
@Autowired
注解标注时,Spring 容器会自动在容器中寻找匹配类型的 Bean,并将其注入到该属性中 - 自动装配可以通过 byType、byName、构造器等方式进行
实际Demo如下:
// UserService.java
public interface UserService {
void createUser();
}
// UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
public void createUser() {
System.out.println("Creating a user...");
}
}
// AdminServiceImpl.java
@Service
public class AdminServiceImpl implements UserService {
public void createUser() {
System.out.println("Creating an admin...");
}
}
// UserController.java
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/createUser")
public String createUser() {
userService.createUser();
return "User created successfully!";
}
}
2.2 new
使用 new 关键字创建对象时,不会触发 Spring 的自动装配机制,因为这只是普通的 Java 对象创建方式
下面这种方式会造成null,注意差别
// User.java
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
// UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
public void createUser() {
System.out.println("Creating a user...");
}
}
// UserController.java
public class UserController {
@Autowired
private UserService userService;
public void createUserManually() {
// 使用 new 关键字手动创建 User 对象
User user = new User("John");
// 此时 userService 为 null,无法自动注入
userService.createUser();
}
}
真正不会造成null的构建对象:
public class Car {
private String brand;
private String model;
public Car(String brand, String model) {
this.brand = brand;
this.model = model;
}
public void drive() {
System.out.println("Driving " + brand + " " + model);
}
}
public class CarDealer {
public void sellCar() {
// 使用 new 关键字创建 Car 对象
Car car = new Car("Toyota", "Corolla");
// 执行 Car 对象的方法
car.drive();
}
}