当前位置: 首页 > news >正文

Spring两个核心IoCDI(一)

目录👑

1、介绍

2、IoC详解

类注解:

方法注解:

3、BeanName

4、启动类路径


1、介绍

IoC(控制反转)和DI(依赖注入)可以理解为一个是存对象,一个是取对象

对象之前是谁使用谁去new一个对象,而IoC就是让spring去创建对象并存储起来,负责对象的初始化、依赖解析和生命周期管理,不需要我们自己再去创建,所以也可以说spring是一个IoC容器。而DI就是从spring容器中取出这个对象。

@Component
public class BookService {@Autowiredprivate BookDao bookDao;public List<BookInfo> getList() {// BookDao bookDao = new BookDao();List<BookInfo> bookInfos = bookDao.mockData();for(BookInfo bookInfo : bookInfos) {if(bookInfo.getStatus() == 2){bookInfo.setStatusCN("可借阅");}else{bookInfo.setStatusCN("不可借阅");}}return bookInfos;}
}

这里的@Component注解就表示把BookService对象交给Spring进行管理(存)

@RequestMapping("/book")
@RestController
public class BookController {@Autowiredprivate BookService bookService;@RequestMapping("/getList")public List<BookInfo> getList() {//BookService bookService = new BookService();List<BookInfo> bookInfos = bookService.getList();return bookInfos;}}

这里的@Autowired注解就表示从Spring中获取BookService对象并把这个对象赋值给bookService这个属性(取)

2、IoC详解

要把某个对象交给IoC容器进行管理有两类注解可以实现:

类注解:

@Controller, @Service, @Repository,@Component, @Configuration

@Controller, @Service, @Repository, @Configuration这4个都是@Component的衍生注解

@Controller:用于控制层,接收请求,对请求进行处理,并进行响应。

规范情况下,对外提供请求接口时,只能用@Controller注解

@Service:用于业务逻辑层,处理具体的业务逻辑

@Repository:用于数据访问层,也成为持久层,负责数据访问操作

@Configuration:配置层,处理项目中的一些配置信息

@Component:要将对象交给Spring IoC容器管理,又不归上面4个注解管的时候,就可以用@Component

方法注解:

@Bean,需要搭配五大注解使用,通常搭配@Component或@Configuration。

可以将方法的返回值作为存储在容器中的Bean,用于同一个类型需要定义多个对象存在IoC容器中或者是将第三方包中的对象放入IoC容器中  (因为我们无法直接修改第三方代码,就不能直接添加五大注解来将对象放入IoC容器中)。

3、BeanName

Bean就是IoC容器管理的特殊对象,beanName是唯一的,不重复的,类似于学生的学号,

beanName默认规则:

一、五大注解

1、类名的小驼峰写法(类名UserController,beanName名字userController)

2、类名前两位为大写时,beanName就是类名

二、@Bean注解(需要搭配五大注解使用,通常搭配@Component或@Configuration),

BeanName为方法名。

@Controller
public class UserController {public void sayHi() {System.out.println("UserController.sayHi");}
}
@SpringBootApplication
public class SpringIoCDemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(SpringIoCDemoApplication.class, args);//方式1UserController bean = context.getBean(UserController.class);bean.sayHi();//方式2UserController userController = (UserController)context.getBean("userController");userController.sayHi();//方式3UserController userController1 = context.getBean("userController", UserController.class);userController1.sayHi();}}

这三种方式获取的Bean对象都是相同的,一个是通过类来获取Bean,一个是通过beanName,一个是结合前两者。

@AllArgsConstructor
@Data
public class UserInfo {private Integer id;private String name;private Integer age;
}
@Configuration
public class UserInfoConfig {@Bean(name = {"user1","lisi"})public UserInfo user1() {UserInfo userInfo = new UserInfo(1,"lisi",15);return userInfo;}@Beanpublic UserInfo user2() {UserInfo userInfo = new UserInfo(2,"kiku",31);return userInfo;}
}

@Bean方法可以定义一个类型的不同Bean,用不同的方法名区分开

可以在@Bean的括号中添加name属性为BeanName重命名,因为它的name属性返回的是一个数组,因此可以设置一个或者多个BeanName

@Bean(name = "lisi"), @Bean(name = {"user1","lisi"})

同样五大注解也可以为BeanName重命名,比如@Configuration("c"),只能设置一个BeanName,不写属性名默认是赋值给value

@SpringBootApplication
public class SpringIoCDemoApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(SpringIoCDemoApplication.class, args);UserInfo userInfo1 = context.getBean("lisi",UserInfo.class);System.out.println(userInfo1);UserInfo userInfo11 = context.getBean("user1",UserInfo.class);System.out.println(userInfo11);UserInfo userInfo2 = context.getBean("user2",UserInfo.class);System.out.println(userInfo2);}}

通过上面的代码我们知道"lisi"和 "user1"都是给user1()这个方法返回的bean设置的beanName,所以userInfo1 和userInfo11获取的是同一个Bean,前面两个打出来一样。

4、启动类路径

默认情况下,spring只会扫描启动类所在的路径下的文件(有@SpringBootApplication注解的就是启动类)

package com.bit.springiocdemo;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringIoCDemoApplication {public static void main(String[] args) {

比如这个启动类的路径就是com.bit.springiocdemo,spring就只扫描这个路径下的内容。

可以通过@ComponentScan()这个注解来指定扫描路径,

比如我们把上面代码的路径改成com.bit

package com.bit.springiocdemo;import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;@ComponentScan(basePackages = "com.bit")
@SpringBootApplication
public class SpringIoCDemoApplication {public static void main(String[] args) {

http://www.dtcms.com/a/342391.html

相关文章:

  • javaweb开发笔记—— 前端工程化
  • 当安全遇上资源瓶颈:轻量级加密为何成为 IoT 时代的刚需?
  • 基于 FPGA 的电磁超声脉冲压缩检测系统
  • 家里Windows,公司Linux?通过cpolar,WSL开发环境无缝切换
  • Python数据可视化利器:Matplotlib从入门到实战全解析
  • 今天我们继续学习计算机网络技术,Cisco软件,三层交换机以及RIP动态协议
  • 从零开始:JDK 在 Windows、macOS 和 Linux 上的下载、安装与环境变量配置
  • DeepSeek R2难产:近期 DeepSeek-V3.1 发布,迈向 Agent 时代的第一步
  • 《杠杆》电视剧分析学习
  • 【python与生活】如何从视频中提取关键帧?
  • JAVA-15 (2025.08.20学习记录)
  • 数据库面试常见问题
  • 【OpenGL】LearnOpenGL学习笔记13 - 深度测试、模板测试
  • 05 ODS层(Operation Data Store)
  • LeetCode算法日记 - Day 18: 只出现一次的数字、只出现一次的数字III
  • 通信工程学习:什么是Template Matching模版匹配
  • iOS 文件管理全景实战 多工具协同提升开发与调试效率
  • Python笔记 第三方库之Pandas的数据组合与缺失数据处理篇
  • 通信工程学习:什么是Camera Calibration相机标定
  • 1000qps怎么保证系统的高可用
  • abc Reachable Set
  • 基于Nodejs作为服务端,React作为前端框架,axios作为通讯框架,实现滑块验证
  • C++ 学习与 CLion 使用:(四)常量和变量,包括字面常量和符号常量
  • 计算机视觉--opencv(代码详细教程)(三)--图像形态学
  • 【框架篇二】FastAPI路由与请求处理
  • javaweb开发笔记——微头条项目开发
  • 零性能妥协:Gearbox Entertainment 通过 AWS 和 Perforce 实现远程开发革命
  • AWS EC2 实例优化检测工具:完整指南与实践
  • WSL的Ubuntu如何改名字
  • AWS Lambda 高并发场景下的错误处理与监控最佳实践