Spring IoC笔记

news2024/10/1 9:56:17

目录

1.什么是 IoC?

2.IoC类注解(五大注解)

2.1那为什么要这么多类注解? 

2.2五大注解是不是可以混用?

2.3程序被spring管理的条件是?

3.bean对象

3.1Bean 命名约定

3.2获取bean对象

4.⽅法注解 @Bean


1.什么是 IoC?

IoC: Inversion of Control (控制反转),是Spring的核⼼思想
什么是控制反转呢?
获得依赖对象的过程被反转了
也就是说, 当需要某个对象时, 传统开发模式中需要⾃⼰通过 new 创建对象, 现在不需要再进⾏创 建, 把创建对象的任务交给容器, 程序中只需要依赖注⼊ (Dependency Injection,DI)就可以了. 这个容器称为:IoC容器. Spring是⼀个IoC容器, 所以有时Spring 也称为Spring 容器。
通过上述我们还可以知道,Spring 是什么?
Spring 是包含了众多⼯具⽅法的 IoC 容器。

2.IoC类注解(五大注解)

前提: 

1.五大类注解:@Controller、@Service、@Repository、@Component、@Configuration 
2.bean对象:在spring容器中存放的对象。
3.ApplicationContext: 翻译过来就是: Spring 上下⽂。这个上下⽂, 就是指当前的运⾏环境, 也可以看作是⼀个容器。故ApplicationContext的对象中存放了所有与当前的运⾏环境有关的内容,比如 spring容器中存放的bean对象。

 它们的功能都是把对象交给spring管理。

2.1那为什么要这么多类注解? 

与应⽤分层呼应,让程序员看到类注解之后,就能直接了解当前类的⽤途。

(1)@Controller:控制层, 接收请求, 对请求进⾏处理, 并进⾏响应.  

(2)@Servie:业务逻辑层, 处理具体的业务逻辑 

(3)@Repository:数据访问层,也称为持久层. 负责数据访问操作  

(4)@Configuration:配置层. 处理项⽬中的⼀些配置信息. 

(5)@Component 是⼀个元注解,也就是说可以注解其他类注解

@Controller , @Service , @Repository ,@Configuration.这些注解被称为 @Component 的衍⽣注解。因为这些注解⾥⾯都有⼀个注解 @Component。

2.2五大注解是不是可以混用?

答:可以,但不是完全可以。

功能上:@Service , @Repository ,@Configuration,@Component 可以完全混用,@Controller有自己的特殊性。

规范上:不可以混用。因为我们想要与应⽤分层呼应。

2.3程序被spring管理的条件是?

 1.要被spring扫描到(默认路径是启动类所在的目录,包括子目录)

手动设置:

@ComponentScan(basePackages = "~~~~~")

2.需要配置五大注解和@Bean


3.bean对象

 1.   Object getBean(String name) throws BeansException;

 2.   <T> T getBean(String name, Class<T> requiredType) throws BeansException;

 3.   Object getBean(String name, Object... args) throws BeansException;

 4.   <T> T getBean(Class<T> requiredType) throws BeansException;

 5.   <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

 常⽤的是上述1,2,4种, 这三种⽅式,获取到的bean是⼀样的

其中1,2种都涉及到根据名称来获取对象. bean的名称是什么呢?

3.1Bean 命名约定

程序开发⼈员不需要为bean指定名称(BeanId), 如果没有显式的提供名称(BeanId),Spring容器将为该 bean⽣成唯⼀的名称.

1.一般命名约定使⽤Java标准约定作为实例字段名. 也就是说,bean名称以⼩写字⺟开头,然后使⽤驼峰式 ⼤⼩写。

2.特殊情况,当有多个字符并且第⼀个和第⼆个字符都是⼤写时, 将保留原始的⼤⼩写. 这些规则 与java.beans.Introspector.decapitalize (Spring在这⾥使⽤的)定义的规则相同.

3.使用@Bean注解的话,对象名就是添加@Bean注解方法的名称。

3.2获取bean对象

 使⽤ @Controller 存储 bean 的代码如下:

@Controller
public class UserController {

    public void sayHi(){
        System.out.println("UserController Hi");
    }
}

启动类: 

import com.wh.ioc.Controller.UserController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class SpringIocApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringIocApplication.class, args);
        UserController bean1 = context.getBean(UserController.class);
        bean1.sayHi();
        UserController bean2 = (UserController) context.getBean("userController");
        bean2.sayHi();
        UserController bean3 = context.getBean("userController", UserController.class);
        bean3.sayHi();
    }

}

4.⽅法注解 @Bean

类注解是添加到某个类上的, 但是存在两个问题:
1.使⽤外部包⾥的类, 没办法添加类注解
2.⼀个类, 需要多个对象, ⽐如多个数据源

⽅法注解 @Bean很好的解决了这两点。 

⽅法注解要配合类注解使⽤
在 Spring 框架的设计中,⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中。
外部类:Student
import lombok.Data;

@Data
public class Student {
    private String name;
    private Integer id;

    public Student() {

    }

    public Student(String name) {
        this.name = name;
    }

    public Student(String name, Integer id) {
        this.name = name;
        this.id = id;
    }
}
BeanConfig类:
import com.wh.ioc.Model.Student;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanConfig {

    @Bean
    public Student StudentInfo() {
        return new Student("wh",01);
    }
    @Bean
    public Student StudentInfo2() {
        return new Student("Bob",02);
    }
}

启动类:

import com.wh.ioc.Controller.UserController;
import com.wh.ioc.Model.Student;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class SpringIocApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringIocApplication.class, args);
        Student student = (Student) context.getBean("StudentInfo");
        System.out.println(student);
        Student student2 = (Student) context.getBean("StudentInfo2");
        System.out.println(student2);
    }
}

以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2182069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《应急通信产业发展研究报告》蓝皮书解读

近日&#xff0c;中国信通院发布了《应急通信产业发展研究报告》蓝皮书&#xff0c;该报告是对中国应急通信产业现状、发展趋势及其政策环境的综合分析&#xff0c;旨在为行业发展提供参考与指导。以下是小编对该蓝皮书的一些内容解读&#xff1a; 1.应急通信的重要性 应急通信…

2.点位管理|前后端如何交互——帝可得后台管理系统

目录 前言点位管理菜单模块1.需求说明2.库表设计3.生成基础代码0 .使用若依代码生成器最终目标1.创建点位管理2.添加数据字典3.配置代码生成信息4.下载代码并导入项目 4.优化菜单——点位管理1.优化区域管理2.增加点位数3. 合作商4.区域管理中添加查看详情功能5.合作商添加点位…

【拥抱AIGC】通义灵码扩展管理

通义灵码提供了扩展管理&#xff0c;支持自定义指令&#xff0c;满足企业编码场景的扩展诉求。 适用版本 企业标准版、企业专属版 通义灵码管理员、组织内全局管理员&#xff08;专属版&#xff09;在通义灵码控制台-扩展管理中&#xff0c;进行自定义指令的管理、查看自定义…

解锁数据宝藏:AI驱动搜索工具,让非结构化数据“说话

哈哈,说起这个 AI 搜索演示啊,那可真是个有意思的话题!非结构化数据,这家伙虽然难搞,但价值却是杠杠的。今天呢,咱就好好聊聊怎么借助 Fivetran 和 Milvus,快速搭建一个 AI 驱动的搜索工具,让企业能从那些乱七八糟的数据里淘到金子! 一、非结构化数据的挑战与机遇 首…

PCL 点云条件滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 条件定义与滤波 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#…

Python从入门到高手4.1节-掌握条件控制语句

目录 4.1.1 理解条件控制 4.1.2 if, elif, else 4.1.3 条件表达式 4.1.4 条件控制可以嵌套 4.1.5 if语句的三元运算 4.1.6 国庆节快乐 4.1.1 理解条件控制 在日常生活中&#xff0c;我们常喜欢说如果, "如果怎么样&#xff0c;那么就会怎么样"。"如果&qu…

240930_CycleGAN循环生成对抗网络

240930_CycleGAN循环生成对抗网络 CycleGAN&#xff0c;也算是笔者记录GAN生成对抗网络的第四篇&#xff0c;前三篇可以跳转 240925-GAN生成对抗网络-CSDN博客 240929-DCGAN生成漫画头像-CSDN博客 240929-CGAN条件生成对抗网络-CSDN博客 在第三篇中&#xff0c;我们采用了p…

【Lazy ORM +Netty+DB开发一个内网渗透工具 wu-lazy-cloud-network(1.2.8-JDK17-SNAPSHOT)】

【Lazy ORM NettyDB开发一个内网渗透工具 wu-lazy-cloud-network&#xff08;1.2.8-JDK17-SNAPSHO&#xff09;】 环境 Java 17Spring Boot 3.xLazy ORMNettyMysql、H2 更新日志 版本1.2.8-JDK17-SNAPSHOT [change] 原《内网穿透》更改为服务端渗透客户端 [change] 新增服务…

Unity 代码裁剪(Strip Engine Code)

文章目录 0.IL2CPP 打包运行闪退问题1.什么是代码裁剪2.为什么要使用代码裁剪3.代码裁剪设置与级别4.强制保留代码4.1 使用[Preserve]标签4.2 使用Link.xml文件 5.Strip中遇到的问题及解决方法6.注意事项 0.IL2CPP 打包运行闪退问题 Google Play要求从2019年8月1日起apk必须支…

Spring系列 AOP实现过程

文章目录 实现原理EnableAspectJAutoProxyAnnotationAwareAspectJAutoProxyCreator 代理创建过程wrapIfNecessarygetAdvicesAndAdvisorsForBeanfindCandidateAdvisorsfindAdvisorsThatCanApply createProxy AspectJ注解处理代理调用过程 实现原理 本文源码基于spring-aop-5.3.…

Arweave的经济学模型

一、存储成本和挖矿奖励 1.1 永久数据存储的成本 由于 Arweave 的核心功能是为其用户提供永久存储&#xff0c;因此必须定义这种存储的定价机制。 作为计算永久存储一份数据的成本的前提&#xff0c;我们必须首先定义单个时间段的数据存储成本&#xff1a; 自数字数据存储技…

算法-数组笔记

二分搜索 . - 力扣&#xff08;LeetCode&#xff09; 使用场景 前提是数组为有序数组&#xff0c;同时题目还强调数组中无重复元素。 因为一旦有重复元素&#xff0c;使用二分查找法返回的元素下标可能不是唯一的&#xff0c;这些都是使用二分法的前提条件&#xff0c;当大…

【Ubuntu】git

文章目录 1.配置SSH key2. 基础知识操作命令1分支branch 如果对git命令使用不熟悉&#xff0c;推荐一个非常棒的git在线练习工具 Learn Git Branching。 https://m.runoob.com/git/git-basic-operations.html 1.配置SSH key ssh-keygen -t rsa -C "YOUR EMAIL"完成…

深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制

我的主页&#xff1a;2的n次方_ 1. JVM 内存区域划分 程序计数器&#xff08;空间比较小&#xff09;。保存了下一条要执行的指令的地址&#xff08;指向元数据区指令的地址&#xff09;堆。JVM 最大的空间&#xff0c;new 出来的对象都在堆上栈。函数中的局部变量&#x…

Linux相关概念和重要知识点(10)(进程优先级、进程切换)

1.进程优先级 &#xff08;1&#xff09;为什么要有进程优先级&#xff1f; 优先级的本质是获得某种资源的先后顺序&#xff0c;如排队买票这件事上排队的本质是在确认优先级&#xff0c;售票窗口就是要竞争的资源。为什么要有优先级&#xff1f;本质就是目标资源比较少&…

VS2022 Git功能的使用

前言 博主最近在学校接触了团队开发的概念&#xff0c;最近也系统性学习了c语言&#xff0c;也是从0开始摸索&#xff0c;一开始博主在推送代码的时候使用的是git bash 后来发现VS2022有Git相关功能&#xff0c;但是博主在网上没有找到通俗易懂适合小白的配置教程&#xff0c;…

HarmonyOS应用六之应用程序进阶一

目录&#xff1a; 1、UIAbility的冷启动和UIAbility热启动2、静态资源和动态资源的访问3、页面跳转3.1、页面返回跳转 4、HAR的ArkUI组件、接口、资源&#xff0c;供其他应用或当前应用的其他模块引用4.1、导出HAR的ArkUI组件4.2、引用HAR的ArkUI组件 5、循环渲染6、状态管理最…

【生成模型】学习笔记

生成模型 生成模型概述&#xff08;通俗解释&#xff09; 生成的核心是生成抽象化的内容&#xff0c;利用已有的内容生成没有的/现实未发生的内容。这个过程类似于人类发挥想象力的过程。 生成模型的应用场景非常广泛&#xff0c;可以应用于艺术表达&#xff0c;如画的生成、…

前端规范工程-2:JS代码规范(Prettier + ESLint)

Prettier 和 ESLint 是两个在现代 JavaScript 开发中广泛使用的工具&#xff0c;它们结合起来可以提供以下作用和优势&#xff1a; 代码格式化和风格统一&#xff1a; Prettier 是一个代码格式化工具&#xff0c;能够自动化地处理代码的缩进、空格、换行等格式问题&#xff0c;…

【PHP陪玩系统源码】游戏陪玩系统app,陪玩小程序优势

陪玩系统开发运营级别陪玩成品搭建 支持二开源码交付&#xff0c;游戏开黑陪玩系统: 多客陪玩系统&#xff0c;游戏开黑陪玩&#xff0c;线下搭子&#xff0c;开黑陪玩系统 前端uniapp后端php&#xff0c;数据库MySQL 1、长时间的陪玩APP源码开发经验&#xff0c;始终坚持从客户…