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

Spring:IoC容器(基于注解管理bean)

1. HelloWorld 

  1. * 引入依赖
  2. * 开启组件扫描
  3. * 使用注解定义 Bean
  4. * 依赖注入

2.开启组件扫描 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--开启组件扫描功能--><!--<context:component-scan base-package="com.itgyl.bean"></context:component-scan>--><context:component-scan base-package="com.itgyl.bean"></context:component-scan>
</beans>

 3.创建bean

@Component//该注解效果等同于<bean id="user" class="...">如果写value创建bean对象值默认使用开头字母为小写的类名
public class User {}

4.完成依赖注入

 @Testpublic void testUser() {ApplicationContext context =new ClassPathXmlApplicationContext("bean.xml");System.out.println(context);//获取bean时会自动完成依赖注入User user = context.getBean(User.class);System.out.println(user);}

 

 2. @Autowire注入

2.1 根据属性自动注入 

以MVC架构模式为栗 

@Controller
public class UserController {/**** 1.根据属性自动注入*/@Autowired //根据类型找到对应对象完成自动注入private UserService userService;public void show() {userService.show();System.out.println("controller...");}
}
@Service
public class UserServiceImp implements UserService{/**** 1.根据属性完成自动注入*/@Autowired //该注解会通过类型找到对应的对象完成注入private UserDao userDao;@Overridepublic void show() {userDao.show();System.out.println("userService...");}
}
@Repository
public class UserDaoImp implements UserDao{@Overridepublic void show() {System.out.println("userDao...");}
}

基于全注解配置IoC容器,把xml的配置文本用类来代替

@Configurable   //基于全注解创建IoC容器配置一个类,该类加上两个注解,注解@Configurable即该类为配置类
@ComponentScan("com.itgyl.autowired") //@ComponentScan注解里面的路径即从哪个包开始扫描自动注入bean
public class SpringConfig {
}
public class TestAutoWired {public static void main(String[] args) {ApplicationContext context =new AnnotationConfigApplicationContext(SpringConfig.class);UserController userController = context.getBean(UserController.class);userController.show();}
}

 

2.2 根据set方法自动注入

/**** 2.根据set方法自动注入*/@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}
/**** 2.根据set方法完成自动注入*/@Autowiredpublic void setUserDao(UserDao userDao) {this.userDao = userDao;}

2.3 根据构造器自动注入

/**** 3.根据构造器完成自动注入*/@Autowiredpublic UserController(UserService userService) {this.userService = userService;}
/**** 3.根据构造器完成自动注入*/@Autowiredpublic UserServiceImp(UserDao userDao) {this.userDao = userDao;}

2.4 通过形参自动注入

/**** 4.通过形参注入*/public UserController(@Autowired UserService userService) {this.userService = userService;}
/**** 4.通过形参注入*/@Autowiredpublic UserServiceImp(@Autowired UserDao userDao) {this.userDao = userDao;}

2.5 通过@AutoWire和@Qualifier注解完成注入

 @Autowired@Qualifier(value = "userServiceImp") //默认名字为开头首字母小写的类的名字private UserService userService;
@Autowired@Qualifier(value = "userDaoImp")private UserDao userDao;

总结

**总结**

* @Autowired注解可以出现在:属性上、构造方法上、构造方法的参数上、setter方法上。
* 当带参数的构造方法只有一个,@Autowired注解可以省略。()
* @Autowired注解默认根据类型注入。如果要根据名称注入的话,需要配合@Qualifier注解一起使用。

 

3. @Resource注入 

 3.1 根据name注入

@Controller
public class UserController {//@Resource注解即该实例化对象源于哪name的值要和传递的实例化对象保持一致//指定值接收就按照该值找相应的实例化bean@Resource(name = "myUserService")private UserService userService;public void show() {userService.show();System.out.println("controller...");}
}

3.2 无name值注入

//@Service中value的值即要传递的实例化对象,接收时的值要和该值保持一致
@Service(value = "myUserService")
public class UserServiceImp implements UserService {//@Resource此时不指定name的值则使用属性中的变量名和传递的bean实例化对象相匹配,要求该属性名和值保持一致//当@Resource注解使用时没有指定name的时候,还是根据name进行查找,这个name是属性名。@Resourceprivate UserDao myUserDaoImp;@Overridepublic void show() {myUserDaoImp.show();System.out.println("userService...");}
}
@Repository("myUserDaoImp")
public class UserDaoImp implements UserDao {@Overridepublic void show() {System.out.println("userDao...");}
}
@Configurable
@ComponentScan("com.itgyl.resource")
public class SpringConfig {
}
public class TestResource {public static void main(String[] args) {//通过全注解方式获取管理对象的IoC容器ApplicationContext context =new AnnotationConfigApplicationContext(SpringConfig.class);UserController u = context.getBean(UserController.class);u.show();}
}

总结

总结:**

@Resource注解:默认byName注入,没有指定name时把属性名当做name,根据name找不到时,才会byType注入。byType注入时,某种类型的Bean只能有一个

 

相关文章:

Spring:IoC容器(基于注解管理bean)

1. HelloWorld * 引入依赖* 开启组件扫描* 使用注解定义 Bean* 依赖注入 2.开启组件扫描 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/20…...

如何解决Redis缓存雪崩问题?

解决Redis缓存雪崩问题&#xff0c;可以从多个方面入手来确保系统在高并发和缓存失效时能够保持稳定运行。以下是一些具体的解决策略&#xff1a; 合理设置缓存过期时间&#xff1a; 避免大量缓存设置相同的过期时间&#xff0c;这样会导致在某一时刻缓存同时失效&#xff0c;…...

vue3的组件通信v-model使用

一、组件通信 1.props 》 父向子传值 props 主要用于父组件向子组件通信。再父组件中通过使用:msgmsg绑定需要传给子组件的属性值&#xff0c;然后再在子组件中用props接收该属性值 方法一 普通方式:// 父组件 传值<child :msg1"msg1" :list"list">…...

从关键新闻和最新技术看AI行业发展(2024.5.6-5.19第二十三期) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky的公众号&…...

一文带你学会如何部署个人博客到云服务器,并进行域名备案与解析!

哈喽&#xff0c;大家好呀&#xff01;这里是码农后端。之前我给大家介绍了如何快速注册一个自己的域名&#xff0c;并创建一台自己的阿里云ECS云服务器。本篇将介绍如何将个人博客部署到云服务器&#xff0c;并进行域名备案与解析。 1、域名备案 注册了域名并购买了云服务器之…...

YoloV8实战:复现基于多任务的YoloV8方案

摘要 自动驾驶中多任务学习,特别是通过设计一种自适应、实时且轻量级的模型来同时处理目标检测、可行驶区域分割和车道线分割,是一种非常有用的研究方法,其中最出名的当属YOLOP模型。然后,YoloP在实时性上并没有得到满足,本文复现基于YoloV8的对任务方案,并在BDD100K数据…...

专题汇编 | ChatGPT引领AIGC新浪潮(一)

ChatGPT的产生与迭代 2022年11月末,美国人工智能研究实验室OpenAI推出ChatGPT。上线的ChatGPT只用了2个月,活跃用户数就突破了1亿,创造了应用增速最快的纪录。 ChatGPT是什么 ChatGPT是一种人工智能技术驱动的自然语言处理(Natural Language Processing,NLP)工具,使用的…...

Excel分类汇总,5个做法,提高数据处理效率!

在日常的工作中&#xff0c;我们经常需要使用Excel中的各种功能&#xff0c;Excel分类汇总功能无疑是数据分析和报告制作中的一把利器&#xff0c;它极大地提高了数据处理的效率和准确性。在现代商业环境中&#xff0c;数据无处不在&#xff0c;而如何从这些数据中提取有效信息…...

使用Nginx实现高可用HTTP和TCP代理:健康检查与最佳实践配置20240523

使用Nginx实现高可用HTTP和TCP代理&#xff1a;健康检查与最佳实践配置 在现代分布式系统中&#xff0c;确保应用的高可用性至关重要。Nginx作为一个高性能的HTTP服务器和反向代理&#xff0c;同时也支持TCP代理&#xff0c;通过合理配置可以大大提高系统的可用性。本文将深入…...

代码随想录算法训练营Day52 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组 | Python | 个人记录向

注&#xff1a;Day51休息。 本文目录 300.最长递增子序列做题看文章 674. 最长连续递增序列做题看文章 718. 最长重复子数组做题看文章 以往忽略的知识点小结个人体会 300.最长递增子序列 代码随想录&#xff1a;300.最长递增子序列 Leetcode&#xff1a;300.最长递增子序列 …...

Python编程的黑暗魔法:模块与包的神秘力量!

哈喽&#xff0c;我是阿佑&#xff0c;今天给大家讲讲模块与包~ 文章目录 1. 引言1.1 模块化编程的意义1.2 Python中模块与包的概念概述 2. 背景介绍2.1 Python模块系统模块的定义与作用Python标准库简介 2.2 包的结构与目的包的定义与目录结构包在项目组织中的重要性 3. 创建与…...

python编程不良习惯纠正: 慎用顶层代码

这几天在跑一个开源代码时&#xff0c;发现&#xff0c;通过pdb断点不起作用&#xff0c;经过一番检查&#xff0c;发现代码运行时甚至没有进入main函数,就开始一顿操作. 然后定位到是在执行"import"操作的时候发生了冗余操作. 经过进一步的检查发现&#xff0c;是下…...

Simulate Ring Resonator in INTERCONNECT

Simulate Ring Resonator in INTERCONNECT 正文正文 首先,我们采用 Interconnect 模块的工作流程 一文中介绍的方法添加一个直波导器件。接着,我们需要对它的名称进行更改,此时我们看左侧 Property View - Root Element 中的 General 属性,我们发现 name 属性是灰色的,无…...

Flutter 中的 DrawerController 小部件:全面指南

Flutter 中的 DrawerController 小部件&#xff1a;全面指南 Flutter 是一个流行的跨平台移动应用开发框架&#xff0c;它提供了丰富的组件和工具来帮助开发者构建高质量的应用。在Flutter中&#xff0c;DrawerController并不是一个内置的组件&#xff0c;但是它的概念可以用于…...

Flutter 中的 ImageFiltered 小部件:全面指南

Flutter 中的 ImageFiltered 小部件&#xff1a;全面指南 在Flutter中&#xff0c;ImageFiltered是一个功能强大的小部件&#xff0c;它允许你对图片应用各种图像处理效果&#xff0c;如模糊、颜色转换、对比度调整等。通过ImageFiltered&#xff0c;你可以为应用添加丰富的视…...

C++第二十弹---深入理解STL中vector的使用

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、vector的介绍 2、vector的使用 2.1、构造函数和赋值重载 2.1.1、构造函数的介绍 2.1.2、代码演示 2.2、容量操作 2.3、遍历 2.4、增删…...

【赠书第24期】Java项目开发实战(微视频版)

文章目录 前言 1 项目选择与需求分析 1.1 项目选择 1.2 需求分析 2 系统设计 2.1 系统架构设计 2.2 数据库设计 2.3 接口设计 3 编码实现 3.1 环境搭建 3.2 编码规范 3.3 编码实现 4 测试与部署 4.1 单元测试 4.2 系统测试 4.3 部署与上线 5 总结与展望 6 推…...

多波段光源 通过8种波长实现的成像解决方案

光源在机器视觉中的重要性不容小觑&#xff0c;它直接影响到图像的质量&#xff0c;进而影响整个系统的性能。光源的作用包括提供足够的照明&#xff0c;并确保被摄物体的特征能够被准确地捕捉到图像中&#xff0c;使被检测物体产生清晰的图像&#xff0c;提高图像的对比度和亮…...

【Python】 如何从日期中减去一天?

基本原理 在编程中&#xff0c;日期和时间的处理是一个常见的需求&#xff0c;尤其是在处理日志、调度任务、数据分析等场景中。Python 提供了多种方式来处理日期和时间&#xff0c;其中最常用的库是 datetime。datetime 模块包含了日期&#xff08;date&#xff09;、时间&am…...

【MySQL精通之路】SQL优化(1)-查询优化(10)-外部联接简化

主博客&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(9)-外部联接优化-CSDN博客 下一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(11)-多范围查询优化-CSDN博客 查询时FROM子句中的表达…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...