前言
获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注入
对象装配(对象注入)的实现⽅法以下 3 种:
- 属性注入
- 构造方法注入
- Setter 注入
接下来,我们分别来看,下⾯我们按照实际开发中的模式,将 Service 类注⼊到 Controller 类中。
一、属性注入
属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。
Service 类的实现代码如下
@Service
public class UserService {
public int userId = 10;
}
Controller 类的实现代码如下:
public class UserController {
// 1.属性注入
@Autowired
private UserService userService;
public void sayHi(){
System.out.println("do hello UserController");
System.out.println("userId -->"+userService.userId);
}
}
}
获取 Controller 中的 sayHi ⽅法:
public class App {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Spring-config.xml");
UserController userController = context.getBean("userController",UserController.class);
userController.sayHi();
}
}
}
运行结果如下
二、 Setter注入
Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注解,如下代码所示:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
1.引入库
代码如下(示例):
public class UserController {
//2.setter注入
@Autowired
private UserService userService;
public void setter(UserService userService){
this.userService = userService;
}
public void sayHi(){
System.out.println("do hello UserController");
System.out.println("userId -->"+userService.userId);
}
}
三、构造方法注入
构造⽅法注⼊是在类的构造⽅法中实现注⼊,如下代码所示:
@Controller
public class UserController {
//3.构造方法注入
@Autowired
private UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
public void sayHi(){
System.out.println("do hello UserController");
System.out.println("userId -->"+userService.userId);
}
}
ps:但是如果类中有多个构造⽅法,那么需要添加上 @Autowired 来明确指到底使⽤哪个构造⽅法,否则程序会报错
三种注入方法的优缺点
1.属性注入
优点:简单
缺点:
1.没办法实现final对象的注入
2.兼容性不好,只是用与Ioc容器
3.风险高,因为写法简单,容易违背单一设计原则
2、Setter注入
优点:符合单一设计原则(每个方法只改变一个对象)
缺点:
1.不能注入不可变对象(final修饰)
2.使用Setter注入的对象可能会被修改。(被别的对象或方法调用)
3、构造方法注入(Spring官方推荐)
优点:
1.可以注入不可变对象
2.注入的对象不会被改变(构造方法只调用一次)
3.可以保证注入对象被完全初始化
4.通用性更好