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/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缓存雪崩问题,可以从多个方面入手来确保系统在高并发和缓存失效时能够保持稳定运行。以下是一些具体的解决策略: 合理设置缓存过期时间: 避免大量缓存设置相同的过期时间,这样会导致在某一时刻缓存同时失效,…...
vue3的组件通信v-model使用
一、组件通信 1.props 》 父向子传值 props 主要用于父组件向子组件通信。再父组件中通过使用:msgmsg绑定需要传给子组件的属性值,然后再在子组件中用props接收该属性值 方法一 普通方式:// 父组件 传值<child :msg1"msg1" :list"list">…...
从关键新闻和最新技术看AI行业发展(2024.5.6-5.19第二十三期) |【WeThinkIn老实人报】
写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术,同时Rocky会对这些关键信息进行解读,力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议,一起交流学习💪 欢迎大家关注Rocky的公众号&…...
一文带你学会如何部署个人博客到云服务器,并进行域名备案与解析!
哈喽,大家好呀!这里是码农后端。之前我给大家介绍了如何快速注册一个自己的域名,并创建一台自己的阿里云ECS云服务器。本篇将介绍如何将个人博客部署到云服务器,并进行域名备案与解析。 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个做法,提高数据处理效率!
在日常的工作中,我们经常需要使用Excel中的各种功能,Excel分类汇总功能无疑是数据分析和报告制作中的一把利器,它极大地提高了数据处理的效率和准确性。在现代商业环境中,数据无处不在,而如何从这些数据中提取有效信息…...
使用Nginx实现高可用HTTP和TCP代理:健康检查与最佳实践配置20240523
使用Nginx实现高可用HTTP和TCP代理:健康检查与最佳实践配置 在现代分布式系统中,确保应用的高可用性至关重要。Nginx作为一个高性能的HTTP服务器和反向代理,同时也支持TCP代理,通过合理配置可以大大提高系统的可用性。本文将深入…...
代码随想录算法训练营Day52 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组 | Python | 个人记录向
注:Day51休息。 本文目录 300.最长递增子序列做题看文章 674. 最长连续递增序列做题看文章 718. 最长重复子数组做题看文章 以往忽略的知识点小结个人体会 300.最长递增子序列 代码随想录:300.最长递增子序列 Leetcode:300.最长递增子序列 …...
Python编程的黑暗魔法:模块与包的神秘力量!
哈喽,我是阿佑,今天给大家讲讲模块与包~ 文章目录 1. 引言1.1 模块化编程的意义1.2 Python中模块与包的概念概述 2. 背景介绍2.1 Python模块系统模块的定义与作用Python标准库简介 2.2 包的结构与目的包的定义与目录结构包在项目组织中的重要性 3. 创建与…...
python编程不良习惯纠正: 慎用顶层代码
这几天在跑一个开源代码时,发现,通过pdb断点不起作用,经过一番检查,发现代码运行时甚至没有进入main函数,就开始一顿操作. 然后定位到是在执行"import"操作的时候发生了冗余操作. 经过进一步的检查发现,是下…...
Simulate Ring Resonator in INTERCONNECT
Simulate Ring Resonator in INTERCONNECT 正文正文 首先,我们采用 Interconnect 模块的工作流程 一文中介绍的方法添加一个直波导器件。接着,我们需要对它的名称进行更改,此时我们看左侧 Property View - Root Element 中的 General 属性,我们发现 name 属性是灰色的,无…...
Flutter 中的 DrawerController 小部件:全面指南
Flutter 中的 DrawerController 小部件:全面指南 Flutter 是一个流行的跨平台移动应用开发框架,它提供了丰富的组件和工具来帮助开发者构建高质量的应用。在Flutter中,DrawerController并不是一个内置的组件,但是它的概念可以用于…...
Flutter 中的 ImageFiltered 小部件:全面指南
Flutter 中的 ImageFiltered 小部件:全面指南 在Flutter中,ImageFiltered是一个功能强大的小部件,它允许你对图片应用各种图像处理效果,如模糊、颜色转换、对比度调整等。通过ImageFiltered,你可以为应用添加丰富的视…...
C++第二十弹---深入理解STL中vector的使用
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【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种波长实现的成像解决方案
光源在机器视觉中的重要性不容小觑,它直接影响到图像的质量,进而影响整个系统的性能。光源的作用包括提供足够的照明,并确保被摄物体的特征能够被准确地捕捉到图像中,使被检测物体产生清晰的图像,提高图像的对比度和亮…...
【Python】 如何从日期中减去一天?
基本原理 在编程中,日期和时间的处理是一个常见的需求,尤其是在处理日志、调度任务、数据分析等场景中。Python 提供了多种方式来处理日期和时间,其中最常用的库是 datetime。datetime 模块包含了日期(date)、时间&am…...
【MySQL精通之路】SQL优化(1)-查询优化(10)-外部联接简化
主博客: 【MySQL精通之路】SQL优化(1)-查询优化-CSDN博客 上一篇: 【MySQL精通之路】SQL优化(1)-查询优化(9)-外部联接优化-CSDN博客 下一篇: 【MySQL精通之路】SQL优化(1)-查询优化(11)-多范围查询优化-CSDN博客 查询时FROM子句中的表达…...
EASY-HWID-SPOOFER:3分钟学会硬件信息伪装终极指南
EASY-HWID-SPOOFER:3分钟学会硬件信息伪装终极指南 【免费下载链接】EASY-HWID-SPOOFER 基于内核模式的硬件信息欺骗工具 项目地址: https://gitcode.com/gh_mirrors/ea/EASY-HWID-SPOOFER 在当今数字时代,您的硬件标识就像是设备的"数字指纹…...
.NET Windows Desktop Runtime终极指南:如何彻底解决Windows桌面应用部署难题?
.NET Windows Desktop Runtime终极指南:如何彻底解决Windows桌面应用部署难题? 【免费下载链接】windowsdesktop 项目地址: https://gitcode.com/gh_mirrors/wi/windowsdesktop 在Windows桌面应用开发领域,最令人头疼的问题往往不是代…...
如何在Photoshop中完美处理WebP格式:WebPShop完全指南
如何在Photoshop中完美处理WebP格式:WebPShop完全指南 【免费下载链接】WebPShop Photoshop plug-in for opening and saving WebP images 项目地址: https://gitcode.com/gh_mirrors/we/WebPShop 还在为Photoshop无法直接处理WebP格式而烦恼吗?W…...
重塑数字记忆:用WeChatExporter解锁微信聊天记录的永久保存方案
重塑数字记忆:用WeChatExporter解锁微信聊天记录的永久保存方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 在数字时代,微信聊天记录已成为我…...
如何3分钟搞定Windows与Office激活:开源KMS工具终极指南
如何3分钟搞定Windows与Office激活:开源KMS工具终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统未激活的水印烦恼吗?Office软件频繁弹出的激活…...
Claude学术写作辅助应用:如何规避AI检测雷区?3步合规化润色法(含Turnitin 2024最新阈值对照表)
更多请点击: https://intelliparadigm.com 第一章:Claude学术写作辅助应用 Claude 系列大模型凭借其长上下文理解能力、严谨的逻辑推理与出色的文本生成质量,正逐步成为科研人员在文献综述、论文润色、实验描述撰写及学术表达规范化过程中的…...
机器学习能否学到真实概率?从校准、博弈到直接可观测性的理论边界与实践启示
1. 项目概述在构建一个声称能够预测未来或评估风险的AI系统时,我们常常会听到这样的承诺:“我们的模型能够学习到事件的真实概率。” 无论是预测明日的降雨、评估贷款的违约风险,还是诊断疾病的概率,这个承诺都极具吸引力。它暗示…...
保姆级教程:用Python+Plotly可视化分析ROS机器人地图分区算法(附代码)
从零实现ROS地图分水岭算法:PythonPlotly动态可视化实战当你第一次看到机器人构建的二维栅格地图时,那些黑白相间的像素块可能只是冰冷的数字矩阵。但在地图分区算法的视角下,每个像素的高度值都代表着"水位"的涨落,而整…...
基于Petri网与机器学习的等离子体化学反应网络简化方法
1. 项目概述与核心挑战在等离子体化学和化学工程领域,我们常常面对一个令人头疼的难题:一个看似简单的物理过程,背后却隐藏着成百上千个相互耦合的化学反应。就拿低温等离子体合成氨(NH₃)这个经典案例来说,…...
【AI Agent旅游行业落地实战指南】:2024年已验证的7大高ROI应用场景与避坑清单
更多请点击: https://kaifayun.com 第一章:AI Agent旅游行业应用全景图 AI Agent正以前所未有的深度与广度重塑旅游产业的服务范式。它不再局限于单点智能响应,而是以目标驱动、多工具协同、自主规划与持续反思为特征,构建起覆盖…...
