03-spirngIOC02-通过注解实现IOC

news/2025/10/4 23:44:48/文章来源:https://www.cnblogs.com/benzhong/p/19126071
03-spirngIOC02-通过注解实现IOC

通过注解实现IOC


实现实体类

package com.zhongge.entity;import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** @ClassName User* @Description TODO* @Author zhongge* @Version 1.0*/
@Component("user01")
public class User {public String getName() {return name;}public void setName(String name) {this.name = name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", address=" + address +'}';}@Value("李华")private String name;@Resourceprivate Address address;
}package com.zhongge.entity;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** @ClassName Address* @Description TODO* @Author zhongge* @Version 1.0*/
@Component
public class Address {public String getLoc() {return loc;}public void setLoc(String loc) {this.loc = loc;}@Overridepublic String toString() {return "Address{" +"loc='" + loc + '\'' +'}';}@Value("毕节")private String loc;public Address(String loc) {this.loc = loc;}public Address() {}
}

测试结果


package com.zhongge.test;import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** @ClassName Main* @Description TODO* @Author zhongge* @Version 1.0*/
public class Main {public static void main(String[] args) {//通过注解获取IOC容器ApplicationContext applicationContext = new AnnotationConfigApplicationContext("com.zhongge.entity");//通过IOC容器获取对象System.out.println(applicationContext.getBean("user01"));}
}

结果:
image


补充知识

要通过注解实现 Spring IOC,需遵循以下核心步骤,结合注解扫描、Bean 标记和依赖注入来完成容器管理:

一、核心注解说明

Spring 提供了一系列注解来替代 XML 配置,实现“零 XML”式 IOC:

注解 作用
@Component 通用组件注解,标记类为 Spring 管理的 Bean(可用于任何层)。
@Service 语义化注解,专用于业务逻辑层(Service 层),功能同 @Component
@Repository 语义化注解,专用于数据访问层(DAO 层),功能同 @Component
@Controller 语义化注解,专用于控制层(如 SpringMVC 的 Controller)。
@Autowired 自动依赖注入,按类型匹配 Bean(可结合 @Qualifier 按名称匹配)。

二、步骤 1:开启注解扫描(替代 XML 的 <context:component-scan>

在 Spring 配置类中用 @ComponentScan 指定需要扫描的包(若用 XML 则需配置 <context:component-scan>)。

方式 1:纯注解配置(推荐 Spring Boot)

@Configuration  // 标记为 Spring 配置类
@ComponentScan(basePackages = "com.zhongge")  // 扫描指定包及其子包下的注解
public class AppConfig {// 无需额外配置,注解扫描由 @ComponentScan 完成
}

方式 2:XML 配置(兼容传统 Spring)

若仍需保留 XML,在 applicationContext.xml 中添加:

<!-- 开启注解扫描,Spring 会自动处理 @Component/@Service 等注解 -->
<context:component-scan base-package="com.zhongge"/>

三、步骤 2:用注解标记 Bean(替代 XML 的 <bean> 标签)

将需要由 Spring 管理的类用 @Component/@Service/@Repository/@Controller 标记。

以你之前的 AddressStudent 为例:

// com.zhongge.entity.Address
@Component  // 标记为 Spring Bean(也可用 @Service/@Repository 等,语义化可选)
public class Address {private String loc;// Getter/Setter/toString 略
}// com.zhongge.entity.Student
@Component
public class Student {@Autowired  // 自动注入 Address 类型的 Beanprivate Address address;private Integer id;private String name;private Integer age;// 构造器/Setter/toString 略
}

四、步骤 3:依赖注入(用 @Autowired 替代 XML 的 <property>/<constructor-arg>

@Autowired 支持字段注入构造器注入Setter 注入三种方式,推荐构造器注入(更符合 Spring 官方推荐)。

1. 字段注入(最简单,直接在属性上标记)

@Component
public class Student {@Autowired  // 直接注入 Address 类型的 Beanprivate Address address;// 其他属性略...
}

2. 构造器注入(Spring 推荐,更利于依赖检查)

@Component
public class Student {private final Address address;private Integer id;private String name;private Integer age;@Autowired  // 构造器上标记,Spring 会自动传入 Address Beanpublic Student(Address address) {this.address = address;}// Setter/toString 略...
}

3. Setter 注入(需提供 Setter 方法)

@Component
public class Student {private Address address;// 其他属性略...@Autowired  // 在 Setter 方法上标记public void setAddress(Address address) {this.address = address;}
}

五、测试注解版 IOC(编写 Main 类)

public class Main {public static void main(String[] args) {// 加载注解配置类(或 XML 配置)ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 或加载 XML:new ClassPathXmlApplicationContext("applicationContext.xml");Student student = context.getBean(Student.class);System.out.println(student); // 应输出包含 Address 的 Student 对象}
}

六、进阶:多 Bean 冲突时的处理

若同一接口有多个实现类(如 Address 有子类 HomeAddressSchoolAddress),需结合 @Qualifier 按名称注入:

// 多个 Address 实现类
@Component("homeAddress")
public class HomeAddress extends Address { ... }@Component("schoolAddress")
public class SchoolAddress extends Address { ... }// Student 中指定注入名称
@Component
public class Student {@Autowired@Qualifier("homeAddress") // 明确注入名称为 "homeAddress" 的 Beanprivate Address address;// ...
}

七、注解 vs XML:优缺点对比

方式 优点 缺点 适用场景
注解 简洁、无 XML 冗余、开发效率高 配置与代码耦合(需修改类) 大多数场景,尤其是 Spring Boot 项目
XML 配置与代码分离、便于统一管理 冗余代码多、维护成本高 需频繁修改配置(如环境切换)、旧项目兼容

而且注解一次只可以实现一个类
通过注解实现 IOC 后,Spring 会自动扫描、创建 Bean 并完成依赖注入,大幅简化了配置流程。如果你的项目是 Spring Boot,只需在主类上加 @SpringBootApplication(内部包含 @ComponentScan),即可零配置实现 IOC。

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

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

相关文章

网站怎么在移动端推广桂林必去五个景点

ON1 Photo RAW 2024 for Mac是一款集专业性与易用性于一体的照片编辑软件。它拥有简洁直观的用户界面&#xff0c;即便对于摄影新手&#xff0c;也能快速上手。软件支持RAW格式照片处理&#xff0c;能够完整保留照片原始信息&#xff0c;让后期调整更加灵活。 在功能方面&#…

网站的运营成本最新人才招聘网

1.0osi七层模型 应用层 data 表示层 会话层 传输层 数据段 防火墙&#xff0c;端口&#xff08;TCP UDP&#xff09; 网络层 数据包 路由器 数据链路层 数据帧 交换机 物理层 比特流 网卡 2.IP地址分类 私有地址 A类 0--127 10.0.0.0…

服务之家网站推广公司网站开发属于技术合同

来源&#xff1a;生物通近年来&#xff0c;有一些证据表明&#xff0c;饮食干预有助于减缓肿瘤的生长。麻省理工学院的一项新研究分析了小鼠的两种不同饮食&#xff0c;揭示了这些饮食是如何影响癌细胞的&#xff0c;并为为什么限制卡路里可以减缓肿瘤生长提供了解释。该研究检…

美食网站 怎么做wordpress客户端制作

引言 作为数据传输界鼎鼎大名的扛把子&#xff0c;XML被应用于各个方面&#xff0c;但随着弱结构化标记语言如JSON、YAML等的出现&#xff0c;人们慢慢的脱离了XML的统治&#xff0c;但在互联网早期的发展当中XML是不可或缺的一部分&#xff0c;比如各种微信开发中的数据传输&…

哈希简单解说

Sky Clearing Up这个哈希确实是啊。 这里不说各种冲突什么东西的证明,因为作者不会,看不懂。 你说说是谁把钢琴和弦乐放一块去的,我怎么飞起来了。 哈希 下面的定义都是不严谨的,这里仅是我的通俗解释。 哈希的基本…

02-springIOC01-注解方式实现

02-springIOC01-注解方式实现$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");使用注解的方式实现IOC 定义两个实体类 /*** @ClassName Address* @Descriptio…

国内买机票的网站建设有啥好玩的网页游戏

简介 TensorFlow是由Google团队开发的一个开源深度学习框架&#xff0c;完全基于Python语言设计。它的初衷是以最简单的方式实现机器学习和深度学习的概念&#xff0c;结合了计算代数的优化技术&#xff0c;使计算许多数学表达式变得简单。 优势&#xff1a; 强大的计算能力…

网站开发的原理西安 房产网站建设

注意&#xff1a;进行实例之前必须完成nginx的源码编译。&#xff08;阅读往期文章完成步骤&#xff09; 1.编辑nginx的配置文件&#xff0c;修改内容 [rootlocalhost ~]# vim /usr/local/nginx/conf/nginx.conf 2.创建新目录/usr/local/nginx/conf.d/&#xff0c;编辑新文件…

Say 题选记(9.28 - 10.4)

P5363 [SDOI2019] 移动金币 Staircase-Nim 加计数。 首先怎么转化成 Staircase-Nim 呢,可以把每个金币右边到下一个金币中间那些空的地方看成这个金币的石子,那么每次金币的向左移动就是把石子从右边金币的堆移到左边…

专题网站建设策划方案浙江省住房和城乡建设厅官方网站

1.IDEA概述 IDEA全称InelliJ IDEA,是用于java语言开发的集成环境&#xff0c;它是业界公认的目前用于Java程序开发最好的工具。 集成环境&#xff1a;把代码编写&#xff0c;编译&#xff0c;执行&#xff0c;调试扽过多种功能综合到一起的开发工具。 下载&#xff1a;https…

做北京会所网站哪个好商城平台

文章目录 网络拓扑安装使用代理服务器设置隐藏者设置 使用古老的ccproxy实现代理服务器&#xff0c;仅做实验用途&#xff0c;禁止做违法犯罪的事情&#xff0c;后果自负。 网络拓扑 均使用Windows Server 2003系统 Router 外网IP&#xff1a;使用NAT模式 IP DHCP自动分配或者…

Excel表设置为细框线

Sub 设置为细框线()边框类型数组 = Array(xlEdgeLeft, xlEdgeTop, xlEdgeBottom, _xlEdgeRight, xlInsideVertical, xlInsideHorizontal)遍历已使用区域的每个单元格For Each 单元格 In ActiveSheet.UsedRangeFor Each…

US$28.5 CG A11DS 3 Buttons Wire Remote Used with CGDI K2 Remote Key Programmer 5pcs/lot

CG A11DS 3 Buttons Wire Remote Used with CGDI K2 Remote Key Programmer 5pcs/lot Package includes:5pc x CG A11DS 3 Buttons Wire Remote Pictures of CG A11DS 3 Buttons Wire Remote Used with CGDI K2 Remote…

延边网站开发depawo怎样提高网站权重

作者&#xff1a;Pablo Samuel Castro、Marc G. Bellemare 来源&#xff1a;Google AI Blog,机器之心摘要&#xff1a;在过去几年里&#xff0c;强化学习研究取得了多方面的显著进展。在过去几年里&#xff0c;强化学习研究取得了多方面的显著进展。这些进展使得智能体能够以超…

前端学习教程-VIte整合ECharts

ECharts 是一个强大的开源数据可视化库,而 Vite 是现代前端构建工具,两者结合可以高效开发数据可视化应用。本教程实现从创建 Vite 项目到使用 ECharts 实现各种图表。 一、环境准备 1. 创建 Vite 项目 首先确保已安…

月牙河做网站公司域名对网站排名的影响

2019独角兽企业重金招聘Python工程师标准>>> 软件的一处功能用到EasyUI的表单提交&#xff0c;返回一串字符串&#xff0c;这串字符串里有一段HTML代码&#xff0c;正常的情况下这段HTML代码里的双引号“ 是用 \ 转义过的。在IE中没问题&#xff0c;但是在Firefox和…

网站开发安全管理爬取漫画数据做网站

在项目管理中&#xff0c;图表作为一种直观的工具&#xff0c;帮助项目经理更有效的规划、监控和控制项目的各个方面&#xff0c;以下是项目经理常用的几张图表&#xff0c;它们在项目管理中发挥着至关重要的作用。 1、甘特图 甘特图&#xff08;Gantt Chart&#xff09;是最…

const不可改变解释

不能对const定义的变量本身重新赋值,但是可以通过其他方式更换变量里面的属性或元素(仅限对象类型和数组类型)。 “不能对const定义的变量本身重新赋值”这指的是 const 创建了一个只读的绑定(read-only binding)…

US$137.75 OTOFIX D1 One Year Update Service (Subsription Only)

OTOFIX D1 One Year Update Service (Subsription Only)1. Please send us the device serial number with picture to our Email 2. No Need Shipping. No refund service3. This is Only for Software Update, Witho…

在哪个平台做网站比较好义务网网站建设方案

工作中的焦虑 帮助团队建立复原力、处理不确定性和完成任务的8项策略 作者&#xff1a;阿德里安-戈斯蒂克、切斯特-埃尔顿和安东尼-戈斯蒂克 Anxiety at Work 8 Strategies to Help Teams Build Resilience, Handle Uncertainty, and Get Stuff Done By Adrian Gostick and…