Spring IoC 注解 总结

1. 简介

本文介绍了Spring的IoC通过注解的方式实现。

2. 具体步骤

用注解的方式向IoC声明Bean总共分为两步:

  • 在对应的class前加上注解
  • xml中添加扫描范围

2.1 在对应的class前加上注解:

@Component //默认id为commonComponent
public class CommonComponent {
}@Component("myid") //指定id为myid,
public class CommonComponent {
}@Controller //和@Component等效,用于Controller层,默认id为myController
public class MyController {
}@Service //和@Component等效,用于Service层,默认id为myService
public class MyService {
}@Repository  //和@Component等效,用于Dao层,默认id为myDao
public class MyDao {
}

2.2 xml中添加扫描范围

总共有三种情况,代码如下:

<?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-4.3.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context-4.3.xsd"><!-- 1.指定在哪里扫描包,包之间用逗号隔开--><context:component-scan base-package="com.jojo.ioc"/><!-- 2.指定在哪里扫描包,但也排除包--><context:component-scan base-package="com.jojo.ioc"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan>
</beans><!-- 3.指定在哪里扫描包,只包含指定包--><context:component-scan base-package="com.jojo.ioc" use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/></context:component-scan>
</beans>

2.3 在配置类中添加扫描范围

使用java配置类代替xml的配置工作

@ComponentScan("com.jojo.ioc_01")//扫描
@PropertySource(value = "classpath:jdbc.properties")
@Configuration
public class JavaConfiguration {
}

2.4 使用

下面介绍如何使用bean

//1.指定xml文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("xxx.xml");//2.得到bean对象
UserController bean = applicationContext.getBean(UserController.class);System.out.println("bean" + bean);
//3.关闭容器
applicationContext.close();

使用配置类的方式:

//方式1创建
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(JavaConfiguration.class);//方式2创建
AnnotationConfigApplicationContext applicationContext1 =new AnnotationConfigApplicationContext();
applicationContext1.register(JavaConfiguration.class);
applicationContext1.refresh();//2.获取Bean
StudentController bean = applicationContext.getBean(StudentController.class);
System.out.println(bean);

3. 周期方法

如果想在类初始化时和销毁时执行函数,可以执行的函数前加上注解即可。

@Component
public class MyClass {@PostConstruct //初始化注解,以下函数在bean对象初始化时执行public void init(){System.out.println("MyClass.init");}@PreDestroy //销毁注解,以下函数在bean对象销毁时执行:单例模式会调用,多例不会调用public void destroy(){System.out.println("MyClass.destroy");}
}

4. 指定为单例还是多例

可以通过注解指定Bean类为单例还是多例。

  • 单例:多次创建对象指向同一个对象。
  • 多例:每次创建对象都new新对象。

单例代码:

@Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)//单例模式
@Component
public class MyClass {
}

多例代码:

@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)//多例模式
@Component
public class MyClass {
}

5. 自动装配

如果在Bean类中要使用其他Bean类,可以使用注解来实现自动装配。

@Controller
public class MyController {//自动装配注解@Autowired //指定装配类为MyService的bean类@Qualifier(value = "myServiceImpl")//如果有多个满足,则指定多个中的一个private MyService myService;//对应类型的bean装配
}

也可使用Resource关键字:

import jakarta.annotation.Resource;
@Controller
public class MyController {//自动装配注解//@Resource 等同于@Autowired@Resource(name = "myServiceImpl")//等同于@Autowired + @Qualifier(value = "myServiceImpl")private MyService myService;//对应类型的bean装配
}

使用Resource注解的话,需要在xml中导入以下依赖:

<dependency><groupId>jakarta.annotation</groupId><artifactId>jakarta.annotation-api</artifactId><version>2.1.1</version>
</dependency>

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

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

相关文章

【machine learning-十-grading descent梯度下降实现】

grading descent 梯度下降参数更新方法 --导数和学习率 从导数项直观理解梯度下降 grading descent 算法就是更新参数&#xff0c;今天来学习下如何更新w和b 梯度下降 还是以线性回归的均方差损失函数如下为例&#xff1a; 损失函数的可视化图如下 &#xff1a; 横轴和纵轴分…

影刀RPA实战:网页爬虫之苦瓜书籍数据

书籍常常被视为心灵的慰藉&#xff0c;因为它们能够在不同的层面上为人们提供支持和安慰。 1. 书籍对我们的重要性 书籍是人类知识的载体&#xff0c;也是智慧的结晶。它们不仅是学习的工具&#xff0c;更是人类心灵的慰藉。在忙碌的生活中&#xff0c;书籍能够提供知识、启发…

魅思CMS getOrderStatus SQL注入漏洞复现

0x01 漏洞描述&#xff1a; 魅思是一款集成了视频管理、用户管理、手机端应用封装等功能的综合性视频管理系统。该系统不仅以其强大的视频管理功能、灵活的用户管理机制、便捷的手机端应用封装功能以及高安全性和现代化的界面设计&#xff0c;成为了市场上备受关注的视频管理系…

技术美术百人计划 | 《4.5 DOF景深算法》笔记

1. 景深定义 景深&#xff08;Depth of Field&#xff0c;DOF&#xff09;&#xff0c;是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。镜头光圈、镜头焦距、及焦平面到拍摄物的距离是影响景深的重要因素。在聚焦完成后&#xff0c;焦点…

监控IDS和IPS增强网络安全性

入侵检测系统&#xff08;IDS&#xff09;和入侵防御系统&#xff08;IPS&#xff09;是当今使用的最复杂的网络安全设备之一&#xff0c;它们检查网络数据包并阻止可疑数据包&#xff0c;并提醒管理员有关攻击企图的信息。 在当今威胁不断变化的网络环境中&#xff0c;防火墙…

TopoDOT2024.1注册机 道路自动化提取 雷达点云数据

TopoDOT2024.1是一套成熟的点云数据处理及应用系统&#xff0c;全面具备点云数据的存储管理、精度检核、特征自动提取、智能分析、高效建模、成果输出等应用功能。TopoDOT在LiDAR数据应用领域有着多年的实战经验&#xff0c;用户在实际项目中长期使用&#xff0c;尤其在交通领域…

iOS 巨魔神器,Geranium 天竺葵:6大功能,个个都解决痛点

嘿&#xff0c;这是黑猫。如果你装了巨魔&#xff0c;却只知道安装第三方APP&#xff0c;那就是暴殄天物。巨魔的价值不仅是应用侧载&#xff0c;还有强大的玩机工具生态——这也是我花费大量时间&#xff0c;去制作巨魔精选IPA合集的原因。 通过巨魔商店安装的APP&#xff0c…

初学者的鸿蒙多线程并发之 TaskPool 踩坑之旅

1. 背景 目标群体&#xff1a;鸿蒙初学者 版本&#xff1a;HarmonyOS 3.1/4.0 背景&#xff1a;鸿蒙 App 的全局路由管理功能&#xff0c;需要在 App 启动时初始化对 raw 下的相关配置文件进行读取、解析并缓存。App 启动时涉及到了大量模块的初始化&#xff0c;好多模块都涉…

智能绘画Midjourney AIGC在设计领域中的应用

科技的进步&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的方式渗透进各个领域&#xff0c;尤其是在艺术创作&#xff0c;尤其是绘画。Midjourney作为AI绘画技术的代表&#xff0c;其AIGC&#xff08;Artificial Intelligence for Generative Content&#xff0…

python SQLAlchemy 数据库连接池

文章目录 前言python SQLAlchemy 数据库连接池1. 安装2. 创建数据库引擎3. 新建表&#xff0c;增删改查demo 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都…

【Linux】—— muduo网络库的安装配置与使用

muduo网络库编程 Linux环境下Epollpthread线程库 Boost库安装与使用 安装Boost库 下载boost库源码&#xff0c;linux环境解压 tar -zxvf boost_1_69_0.tar.gz 解压完成后&#xff0c;进入该目录&#xff0c;查看内容 运行bootstrap.sh工程编译构建程序 ./bootstrap.sh …

JAVA同城生活新引擎外卖跑腿团购到店服务多合一高效系统小程序源码

&#x1f680;同城生活新风尚&#xff01;一站式高效系统&#xff0c;让日常更便捷&#x1f6cd;️ &#x1f37d;️【开篇&#xff1a;同城生活&#xff0c;一触即发】&#x1f37d;️ 在这个快节奏的时代&#xff0c;同城生活的便利性与效率成为了我们追求的新风尚。想象一下…

C# 从字符串中分离文件路径、文件名及扩展名

C# 从字符串中分离文件路径、文件名及扩展名 对文件进行操作时&#xff0c;首先要获取文件路径信息&#xff0c;然后创建文件对象&#xff0c;通过IO流将数据读取大宋内存中并进行处理。在操作文件时&#xff0c;可能还需要提取文件的一些信息&#xff0c;比如&#xff0c;文件…

有效安全计划评估的基本指标

衡量安全计划成功与否的最有效指标是什么&#xff1f; 最直接的指标是&#xff1a;您的组织是否遭到入侵&#xff1f;如果答案是肯定的&#xff0c;那么显然还有工作要做。如果答案是否定的&#xff0c;那么您的状况就更好了——但情况比这更复杂。 即使您没有遭到入侵&#…

SonarWiz 8.0.1注册机 全模块版本侧扫、浅剖、测深软件功能等

SonarWiz 8.0.1是功能强大的测绘软件&#xff01;提供强大的数据采集、后处理等功能操作&#xff0c;您将获得灵活完整的报告&#xff0c;并提供丰富的选项以便进行定制和更灵活的进行操作&#xff0c;软件功能齐全&#xff0c;包括完整的海底测绘解决方案&#xff0c;方便实时…

chapter15-泛型——(自定义泛型)——day20

目录 561-自定义泛型类 562-自定义泛型接口 563-自定义泛型方法 泛型就是可以接受一种数据类型的类型 564-泛型方法练习 565-泛型继承和通配 566-JUnit使用 568-泛型家庭作业 561-自定义泛型类 562-自定义泛型接口 563-自定义泛型方法 泛型就是可以接受一种数据类型的类型…

数据结构(Day16)

一、学习内容 1、有关顺序表的操作&#xff08;功能函数&#xff09; 1、创建顺序表 Plist create_list(){Plist L malloc(sizeof(list)); // 为顺序表分配内存空间if(NULL L){printf("申请空间失败\n");return NULL; // 如果内存分配失败&#xff0c;返回 NU…

node发送邮件:如何实现Node.js发信功能?

node发送邮件及附件方法&#xff1f;如何用nodejs自动发送邮件&#xff1f; 无论是用于用户注册确认、密码重置&#xff0c;还是用于发送通知和报告&#xff0c;Node发送邮件功能都是非常有用的。AokSend将详细介绍如何使用Node.js实现发信功能&#xff0c;帮助你掌握这一重要…

kubernetes存储之GlusterFS(GlusterFS for Kubernetes Storage)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

虚拟机的ip总是自己变化如何解决?

目录 修改配置文件&#xff1a; 如果出现错误E212&#xff1a;无法打开并写入文件&#xff1a; 如果显示当前用户没有在sudoers文件中&#xff0c;就按照下面方法操作。 修改配置文件&#xff1a; 变化的原因&#xff1a;在配置文件/etc/sysconfig/network-scripts/ifcfg-e…