首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Java EE进阶 --- SpringBoot】Spring DI详解

【Java EE进阶 --- SpringBoot】Spring DI详解

作者头像
optimistic_chen
发布2026-01-14 20:25:30
发布2026-01-14 20:25:30
1110
举报

DI详解

DI(Dependency Injection)依赖注入:容器在运⾏期间,动态的为应⽤程序提供运⾏时所依赖的资源,称之为依赖注⼊。

依赖注入是一个过程,当IoC容器创建Bean时,提供运⾏时所依赖的资源,⽽资源指的就是对象。我们使用@Autowired注解完成依赖注入。换句话说:就说把对象取出来放到某个类的属性中。前面我们知道@Controller等注解实现把对象交给Spring管理(IoC容器),而现在我们使用@Autowired注解把对象拿出来。

注入

关于依赖的注入,Spring给我们提供三种方法:

  1. 属性注入
  2. 构造方法注入
  3. Setter注入

属性注入

属性注入使用@Autowired实现的,将Service类注入到Controller类中,

Service类

代码语言:javascript
复制
@Service
public class UserService {
    public void m1(){
        System.out.println("UserService");
    }
}

Controller类

代码语言:javascript
复制
@ResponseBody
@Controller
public class UserController {
    @Autowired
    private UserService userService;
    @RequestMapping("/m1")
    public void m1(){
        System.out.println("UserController");
        userService.m1();
    }
}

实现方法

代码语言:javascript
复制
@SpringBootApplication
public class DemoApplication {
	public static void main(String[] args) {
		//获取上下文对象
		ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
		UserController userController=(UserController) context.getBean("userController");
		userController.m1();
	}
}
在这里插入图片描述
在这里插入图片描述

如果删掉@Autowired注解,那么只会执行Controller类

在这里插入图片描述
在这里插入图片描述

构造方法注入

构造⽅法注⼊是在类的构造⽅法中实现注⼊

代码语言:javascript
复制
@ResponseBody
@Controller
public class UserController {
    private UserService userService;
    public UserController(UserService userService) {
        this.userService = userService;
    }

    public void m1(){
        System.out.println("UserController");
        userService.m1();
    }
}

注意:如果类中只有一个构造方法,那么@Autowired注解就可以省略;如果类中有多个构造⽅法,那么需要添加上@Autowired 来明确指定到底使⽤哪个构造⽅法

代码语言:javascript
复制
@ResponseBody
@Controller
public class UserController {
    private UserService userService;
    private UserService2 userService2;

    public UserController(UserService userService) {
        this.userService = userService;
    }
    @Autowired
    public UserController(UserService2 userService2) {
        this.userService2 = userService2;
    }

    public void m1(){
        System.out.println("UserController");
        userService.m1();
    }

    public void m2(){
        System.out.println("UserController2");
        userService2.m2();
    }
}

Service

代码语言:javascript
复制
@Service
public class UserService {
    public void m1(){
        System.out.println("UserService");
    }
}

Service2

代码语言:javascript
复制
@Service
public class UserService2 {
    public void m2(){
        System.out.println("UserService2");
    }
}
在这里插入图片描述
在这里插入图片描述

Setter注入

Setter注入和属性的Setter方法实现类似,只是在设置set方法时需要加上@Autowired注解

代码语言:javascript
复制
@ResponseBody
@Controller
public class UserController {
    private UserService userService;
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void m1(){
        System.out.println("UserController");
        userService.m1();
    }

}
在这里插入图片描述
在这里插入图片描述

优势与缺点

属性注入   优点:简洁,使用方便   缺点:只能用于IoC容器,不能注⼊⼀个Final修饰的属性 构造方法注入   优点:可以注入Final修饰的属性;注入的对象不会被修改;通用性好,构造方法是                JDK支持的,适合任何框架   缺点:注入多个对象时,代码比较繁琐 Setter注入   优点:方便在类实例之后,重新对该对象进行配置或者注入   缺点:不能注入一个Final修饰的属性;注入对象可能会被改变

Autowired存在问题

上篇博客最后提到,当同一类型有多个Bean时,Spring不知道注入哪一个,所以使用@Primary注解,确定默认的注解。现在还有两个注解可以解决这种问题。

@Qualifier注解

@Qualifier注解:指定当前要注⼊的bean对象。在@Qualifier的value属性中,指定注⼊的bean的名称 Controller类

代码语言:javascript
复制
@ResponseBody
@Controller
public class UserController {
    @Qualifier("student2")
    @Autowired
    private Student student;

    public void hello(){
        System.out.println("hello UserController");
        System.out.println(student);
    }
}

StudentComponent类

代码语言:javascript
复制
@Component
public class StudentComponent {
    @Bean
    public Student student() {
        Student student=new Student();
        student.setName("zhangsan");
        student.setAge(12);
        return student;
    }

    @Bean
    public Student student2() {
        return new Student("da",13);
    }
}
在这里插入图片描述
在这里插入图片描述

@Resource注解

使⽤@Resource注解:是按照bean的名称进⾏注⼊。通过name属性指定要注⼊的bean的名称

Controller类

代码语言:javascript
复制
@ResponseBody
@Controller
public class UserController {
    @Resource(name="student")
    private Student student;

    public void hello(){
        System.out.println("hello UserController");
        System.out.println(student);
    }
}

总结: @Autowired是spring框架提供的注解,⽽@Resource是JDK提供的注解 @Autowired默认是按照类型注⼊,⽽@Resource是按照名称注⼊.相⽐于@Autowired 来说,@Resource ⽀持更多的参数设置,例如name设置,根据名称获取Bean

完结

点一个免费的赞并收藏起来~ 点点关注,避免找不到我~ 我的主页:optimistic_chen我们下期不见不散 ~ ~ ~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • DI详解
  • 注入
    • 属性注入
    • 构造方法注入
    • Setter注入
  • 优势与缺点
  • Autowired存在问题
    • @Qualifier注解
    • @Resource注解
  • 完结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档