Spring IoC&DI
1. IoC & DI ⼊⻔
1.1 Spring 是什么?
1.1.1 什么是容器?
容器是⽤来容纳某种物品的(基本)装置。
1.1.2 什么是 IoC?
IoC: Inversion of Control (控制反转), 也就是说 Spring 是⼀个"控制反转"的容器.
1.2 IoC 介绍
1.2.1 传统程序开发
1 public class NewCarExample {
2 public static void main(String[] args) {
3 Car car = new Car();
4 car.run();
5 }
6
7 /**
8 * 汽⻋对象
9 */
10 static class Car {
11 private Framework framework;
12
13 public Car() {
14 framework = new Framework();
15 System.out.println("Car init....");
16 }
17 public void run(){
18 System.out.println("Car run...");
19 }
20 }
21
22 /**
23 * ⻋⾝类
24 */
25 static class Framework {
26 private Bottom bottom;
27
28 public Framework() {
29 bottom = new Bottom();
30 System.out.println("Framework init...");
31 }
32 }
33
34 /**
35 * 底盘类
36 */
37 static class Bottom {
38 private Tire tire;
39
40 public Bottom() {
41 this.tire = new Tire();
42 System.out.println("Bottom init...");
43 }
44 }
45
46 /**
47 * 轮胎类
48 */
49 static class Tire {
50 // 尺⼨
51 private int size;
52
53 public Tire(){
54 this.size = 17;
55 System.out.println("轮胎尺⼨:" + size);
56 }
57 }
58 }
1.2.2 问题分析
1.2.3 解决⽅案
1.2.4 IoC程序开发
1 public class IocCarExample {
2 public static void main(String[] args) {
3 Tire tire = new Tire(20);
4 Bottom bottom = new Bottom(tire);
5 Framework framework = new Framework(bottom);
6 Car car = new Car(framework);
7 car.run();
8 }
9
10 static class Car {
11 private Framework framework;
12
13 public Car(Framework framework) {
14 this.framework = framework;
15 System.out.println("Car init....");
16 }
17 public void run() {
18 System.out.println("Car run...");
19 }
20 }
21
22 static class Framework {
23 private Bottom bottom;
24
25 public Framework(Bottom bottom) {
26 this.bottom = bottom;
27 System.out.println("Framework init...");
28 }
29 }
30
31 static class Bottom {
32 private Tire tire;
33
34 public Bottom(Tire tire) {
35 this.tire = tire;
36 System.out.println("Bottom init...");
37 }
38 }
39
40 static class Tire {
41 private int size;
42
43 public Tire(int size) {
44 this.size = size;
45 System.out.println("轮胎尺⼨:" + size);
46 }
47 }
48 }
优点:资源不由使⽤资源的双⽅管理,⽽由不使⽤资源的第三⽅管理
1.3 DI 介绍
2. IoC & DI 使⽤
3. IoC 详解
3.1 Bean的存储
3.1.1 @Controller(控制器存储)
1 @Controller // 将对象存储到 Spring 中
2 public class UserController {
3 public void sayHi(){
4 System.out.println("hi,UserController...");
5 }
6 }
1 @SpringBootApplication
2 public class SpringIocDemoApplication {
3
4 public static void main(String[] args) {
5 //获取Spring上下⽂对象
6 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio
7 //从Spring上下⽂中获取对象
8 UserController userController = context.getBean(UserController.class);
9 //使⽤对象
10 userController.sayHi();
11 }
12 }
1 public interface BeanFactory {
2
3
4
5 // 1. 根据bean名称获取bean
6 Object getBean(String var1) throws BeansException;
7 // 2. 根据bean名称和类型获取bean
8 <T> T getBean(String var1, Class<T> var2) throws BeansException;
9 // 3. 按bean名称和构造函数参数动态创建bean,只适⽤于具有原型(prototype)作⽤域的bean
10 Object getBean(String var1, Object... var2) throws BeansException;
11 // 4. 根据类型获取bean
12 <T> T getBean(Class<T> var1) throws BeansException;
13 // 5. 按bean类型和构造函数参数动态创建bean, 只适⽤于具有原型(prototype)作⽤域的bean
14 <T> T getBean(Class<T> var1, Object... var2) throws BeansException;
15
16
17 }
1 @SpringBootApplication
2 public class SpringIocDemoApplication {
3
4 public static void main(String[] args) {
5 //获取Spring上下⽂对象
6 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio
7 //从Spring上下⽂中获取对象
8 //根据bean类型, 从Spring上下⽂中获取对象
9 UserController userController1 = context.getBean(UserController.class);
10 //根据bean名称, 从Spring上下⽂中获取对象
11 UserController userController2 = (UserController) context.getBean("userCon
12 //根据bean类型+名称, 从Spring上下⽂中获取对象
13 UserController userController3 = context.getBean("userController",UserCont
14
15 System.out.println(userController1);
16 System.out.println(userController2);
17 System.out.println(userController3);
18 }
19 }
3.1.2 @Service(服务存储)
使⽤ @Service 存储 bean 的代码如下所⽰:
1 @Service
2 public class UserService {
3 public void sayHi(String name) {
4 System.out.println("Hi," + name);
5 }
6 }
1 @SpringBootApplication
2 public class SpringIocDemoApplication {
3
4 public static void main(String[] args) {
5 //获取Spring上下⽂对象
6 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio
7 //从Spring中获取UserService对象
8 UserService userService = context.getBean(UserService.class);
9 //使⽤对象
10 userService.sayHi();
11 }
}
3.1.3 @Repository(仓库存储)
1 @Repository
2 public class UserRepository {
3 public void sayHi() {
4 System.out.println("Hi, UserRepository~");
5 }
6 }
1 @SpringBootApplication
2 public class SpringIocDemoApplication {
3
4 public static void main(String[] args) {
5 //获取Spring上下⽂对象
6 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio
7 //从Spring上下⽂中获取对象
8 UserRepository userRepository = context.getBean(UserRepository.class);
9 //使⽤对象
10 userRepository.sayHi();
11 }
12 }
3.1.4 @Component(组件存储)
1 @Component
2 public class UserComponent {
3 public void sayHi() {
4 System.out.println("Hi, UserComponent~");
5 }
6 }
1 @SpringBootApplication
2 public class SpringIocDemoApplication {
3
4 public static void main(String[] args) {
5 //获取Spring上下⽂对象
6 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio
7 //从Spring上下⽂中获取对象
8 UserComponent userComponent = context.getBean(UserComponent.class);
9 //使⽤对象
10 userComponent.sayHi();
11 }
12 }
3.1.5 @Configuration(配置存储)
1 @Configuration
2 public class UserConfiguration {
3 public void sayHi() {
4 System.out.println("Hi,UserConfiguration~");
5 }
6 }
1 @SpringBootApplication
2 public class SpringIocDemoApplication {
3
4 public static void main(String[] args) {
5 //获取Spring上下⽂对象
6 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio
7 //从Spring上下⽂中获取对象
8 UserConfiguration userConfiguration = context.getBean(UserConfiguration.cl
9 //使⽤对象
10 userConfiguration.sayHi();
11 }
12 }
3.2 为什么要这么多类注解?
3.3 ⽅法注解 @Bean
3.3.1 ⽅法注解要配合类注解使⽤
在 Spring 框架的设计中,⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中
1 @Component
2 public class BeanConfig {
3 @Bean
4 public User user(){
5 User user = new User();
6 user.setName("zhangsan");
7 user.setAge(18);
8 return user;
9 }
10 }
1 @SpringBootApplication
2 public class SpringIocDemoApplication {
3
4 public static void main(String[] args) {
5 //获取Spring上下⽂对象
6 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio
7 //从Spring上下⽂中获取对象
8 User user = context.getBean(User.class);
9 //使⽤对象
10 System.out.println(user);
11 }
12 }
3.3.2 定义多个对象
1 @Component
2 public class BeanConfig {
3 @Bean
4 public User user1(){
5 User user = new User();
6 user.setName("zhangsan");
7 user.setAge(18);
8 return user;
9 }
10
11 @Bean
12 public User user2(){
13 User user = new User();
14 user.setName("lisi");
15 user.setAge(19);
16 return user;
17 }
18 }
1 @SpringBootApplication
2 public class SpringIocDemoApplication {
3
4 public static void main(String[] args) {
5 //获取Spring上下⽂对象
6 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio
7 //从Spring上下⽂中获取对象
8 User user = context.getBean(User.class);
9 //使⽤对象
10 System.out.println(user);
11 }
12 }
1 @SpringBootApplication
2 public class SpringIocDemoApplication {
3
4 public static void main(String[] args) {
5 //获取Spring上下⽂对象
6 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio
7 //根据bean名称, 从Spring上下⽂中获取对象
8 User user1 = (User) context.getBean("user1");
9 User user2 = (User) context.getBean("user2");
10 System.out.println(user1);
11 System.out.println(user2);
12 }
13 }
结果:
3.3.3 重命名 Bean
1 @Bean(name = {"u1","user1"})
2 public User user1(){
3 User user = new User();
4 user.setName("zhangsan");
5 user.setAge(18);
6 return user;
7 }
1 @SpringBootApplication
2 public class SpringIocDemoApplication {
3
4 public static void main(String[] args) {
5 //获取Spring上下⽂对象
6 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio
7 //从Spring上下⽂中获取对象
8 User u1 = (User) context.getBean("u1");
9 //使⽤对象
10 System.out.println(u1);
11 }
12 }
1 @Bean({"u1","user1"})
2 public User user1(){
3 User user = new User();
4 user.setName("zhangsan");
5 user.setAge(18);
6 return user;
7 }
1 @Bean("u1")
2 public User user1(){
3 User user = new User();
4 user.setName("zhangsan");
5 user.setAge(18);
6 return user;
7 }
3.4 扫描路径
1 @SpringBootApplication
2 public class SpringIocDemoApplication {
3
4 public static void main(String[] args) {
5 //获取Spring上下⽂对象
6 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio
7 //从Spring上下⽂中获取对象
8 User u1 = (User) context.getBean("u1");
9 //使⽤对象
10 System.out.println(u1);
11 }
12 }
4. DI 详解
4.1 属性注⼊
1 import org.springframework.stereotype.Service;
2
3 @Service
4 public class UserService {
5 public void sayHi() {
6 System.out.println("Hi,UserService");
7 }
8 }
1 @Controller
2 public class UserController {
3 //注⼊⽅法1: 属性注⼊
4 @Autowired
5 private UserService userService;
6
7 public void sayHi(){
8 System.out.println("hi,UserController...");
9 userService.sayHi();
10 }
11 }
1 @SpringBootApplication
2 public class SpringIocDemoApplication {
3
4 public static void main(String[] args) {
5 //获取Spring上下⽂对象
6 ApplicationContext context = SpringApplication.run(SpringIocDemoApplicatio
7 //从Spring上下⽂中获取对象
8 UserController userController = (UserController) context.getBean("userCont
9 //使⽤对象
10 userController.sayHi();
11 }
12 }
结果
4.2 构造⽅法注⼊
1 @Controller
2 public class UserController2 {
3 //注⼊⽅法2: 构造⽅法
4 private UserService userService;
5
6 @Autowired
7 public UserController2(UserService userService) {
8 this.userService = userService;
9 }
10
11 public void sayHi(){
12 System.out.println("hi,UserController2...");
13 userService.sayHi();
14 }
15 }
4.3 Setter 注⼊
1 @Controller
2 public class UserController3 {
3 //注⼊⽅法3: Setter⽅法注⼊
4 private UserService userService;
5
6 @Autowired
7 public void setUserService(UserService userService) {
8 this.userService = userService;
9 }
10
11 public void sayHi(){
12 System.out.println("hi,UserController3...");
13 userService.sayHi();
14 }
15 }
4.4 三种注⼊优缺点分析
4.5 @Autowired存在问题
1 @Component
2 public class BeanConfig {
3
4 @Bean("u1")
5 public User user1(){
6 User user = new User();
7 user.setName("zhangsan");
8 user.setAge(18);
9 return user;
10 }
11
12 @Bean
13 public User user2() {
14 User user = new User();
15 user.setName("lisi");
16 user.setAge(19);
17 return user;
18 }
19 }
1 @Controller
2 public class UserController {
3
4 @Autowired
5 private UserService userService;
6 //注⼊user
7 @Autowired
8 private User user;
9
10 public void sayHi(){
11 System.out.println("hi,UserController...");
12 userService.sayHi();
13 System.out.println(user);
14 }
15 }
结果:
1 @Component
2 public class BeanConfig {
3
4 @Primary //指定该bean为默认bean的实现
5 @Bean("u1")
6 public User user1(){
7 User user = new User();
8 user.setName("zhangsan");
9 user.setAge(18);
10 return user;
11 }
12
13 @Bean
14 public User user2() {
15 User user = new User();
16 user.setName("lisi");
17 user.setAge(19);
18 return user;
19 }
20 }
1 @Controller
2 public class UserController {
3 @Qualifier("user2") //指定bean名称
4 @Autowired
5 private User user;
6
7 public void sayHi(){
8 System.out.println("hi,UserController...");
9 System.out.println(user);
10 }
11 }
1 @Controller
2 public class UserController {
3 @Resource(name = "user2")
4 private User user;
5
6 public void sayHi(){
7 System.out.println("hi,UserController...");
8 System.out.println(user);
9 }
10 }
原文地址:https://blog.csdn.net/qq_66333706/article/details/140399233
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!