Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入

🐌个人主页: 🐌 叶落闲庭
💨我的专栏:💨
c语言
数据结构
javaweb
石可破也,而不可夺坚;丹可磨也,而不可夺赤。
Spring注解开发
- 一、注解开发定义Bean
- 二、纯注解开发Bean
- 三、bean的管理
- 3.1bean的作用范围
- 3.2bean的生命周期
- 四、注解开发依赖注入
- 五、bean管理
- 5.1第三方bean管理
- 5.2第三方bean依赖注入
- 5.2.1简单依赖注入
- 5.2.2引用依赖注入
一、注解开发定义Bean
- 使用
@Component定义bean:
@Component("bookDao")
public class BookDaoImpl1 implements BookDao {@Overridepublic void save() {System.out.println("BookDao save...");}
}
- 核心配置文件中通过组件扫描加载bean:
<context:component-scan base-package="com.practice"/>
- 代码效果:
public class App1 {public static void main(String[] args) {ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext1.xml");BookDao bookDao = (BookDao) act.getBean("bookDao");System.out.println(bookDao);//按类型找BookService bookService = act.getBean(BookService.class);System.out.println(bookService);}
}

- Spring提供
@Component注解的三个衍生注解:@Controller:用于表现层bean定义@Service:用于业务层bean定义@Repository:用于数据层bean定义
二、纯注解开发Bean
- java类代替了Spring核心配置文件
- Spring核心配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.practice"/>
</beans>
- java类:
@Configuration
@ComponentScan("com.practice")
public class SpringConfig {}
@Configuration表示配置文件,当前类为配置类@ComponentScan表示扫描包下的配置信息,设定扫描路径,此注解只能添加一次,多个数据请用数组格式。
@ComponentScan({"com.practice.dao","com.practice.service"})
- 读取Spring核心配置文件初始化容器切换为读取Java配置类初始化容器对象
//读取Spring核心配置文件
ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext1.xml");
//读取Java配置类
ApplicationContext act = new AnnotationConfigApplicationContext(SpringConfig.class);
三、bean的管理
3.1bean的作用范围
- 单例对象:
@Repository("bookDao1")
@Scope("singleton")
public class BookDaoImpl2 implements BookDao {@Overridepublic void save() {System.out.println("BookDao save...");}
}
@Configuration
@ComponentScan("com.practice")
public class SpringConfig {}
public class AppForAnnotation1 {public static void main(String[] args) {ApplicationContext act = new AnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao1 = (BookDao) act.getBean("bookDao1");BookDao bookDao2 = (BookDao) act.getBean("bookDao1");System.out.println(bookDao1);System.out.println(bookDao2);}
}

- 非单例:
@Repository("bookDao1")
@Scope("singleton")
public class BookDaoImpl2 implements BookDao {@Overridepublic void save() {System.out.println("BookDao save...");}
}
@Configuration
@ComponentScan("com.practice")
public class SpringConfig {}
public class AppForAnnotation1 {public static void main(String[] args) {ApplicationContext act = new AnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao1 = (BookDao) act.getBean("bookDao1");BookDao bookDao2 = (BookDao) act.getBean("bookDao1");System.out.println(bookDao1);System.out.println(bookDao2);}
}

- 使用
@Scope("singleton")定义bean的作用范围
3.2bean的生命周期
- 使用
@PostConstruct、@PreDestroy定义bean的生命周期
@Repository("bookDao1")
@Scope("singleton")
public class BookDaoImpl2 implements BookDao {@Overridepublic void save() {System.out.println("BookDao save...");}@PostConstructpublic void init() {System.out.println("BookDao init...");}@PreDestroypublic void destroy() {System.out.println("BookDao destroy...");}}

四、注解开发依赖注入
- 使用
@Autowired注解开启自动装配模式(按类型)
@Service
public class BookServiceImpl implements BookService {@Autowiredprivate BookDao bookDao;@Overridepublic void save() {System.out.println("bookService save...");bookDao.save();}
}
- 自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法
- 自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法
- 使用
@Qualifier注解开启指定名称装配bean
@Service
public class BookServiceImpl implements BookService {@Autowired@Qualifier("bookDao2")private BookDao bookDao;@Overridepublic void save() {System.out.println("bookService save...");bookDao.save();}
}
- 注意:
@Qualifier注解无法单独使用,必须配合@Autowired注解使用 - 使用
@Value()实现简单注入
@Repository("bookDao")public class BookDaoImpl1 implements BookDao {@Value("practice")private String name;@Overridepublic void save() {System.out.println("BookDao save..." + name);}
}

- 使用
@PropertySource注解加载properties文件
@Configuration
@ComponentScan("com.practice")
@PropertySource({"jdbc3.properties"})
public class SpringConfig {
}
- 注意:路径仅支持单一文件配置,多文件请使用数组格式配置,不能使用通配符
*
五、bean管理
5.1第三方bean管理
- 使用
@Bean配置第三方bean
public class JdbcConfig {//1.定义方法获得要管理的对象//2.添加注解@Beanpublic DataSource dataSource(){DruidDataSource ds = new DruidDataSource();ds.setDriverClassName("com.mysql.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/mybatis");ds.setUsername("root");ds.setPassword("123456");return ds;}
}
- 将独立的配置类加入核心配置
-
- 方式一:导入式
public class JdbcConfig {//1.定义方法获得要管理的对象//2.添加注解@Beanpublic DataSource dataSource(){DruidDataSource ds = new DruidDataSource();ds.setDriverClassName("com.mysql.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/mybatis");ds.setUsername("root");ds.setPassword("123456");return ds;}
}
- 使用注解手动加入配置类到核心配置,此注解只能添加一次,多个数据采用数组形式
@Import({JdbcConfig.class})
public class SpringConfig {
}
- 将独立的配置加入核心配置
- 方式二:扫描式
@Configuration
public class JdbcConfig {//1.定义方法获得要管理的对象//2.添加注解@Beanpublic DataSource dataSource(){DruidDataSource ds = new DruidDataSource();ds.setDriverClassName("com.mysql.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/mybatis");ds.setUsername("root");ds.setPassword("123456");return ds;}
}
- 使用注解扫描配置类所在的包,加载对应的配置类信息
@Configuration
@ComponentScan("com.practice")
public class SpringConfig {
}
5.2第三方bean依赖注入
5.2.1简单依赖注入
public class JdbcConfig {@Value("com.mysql.jdbc.Driver")private String driver;@Value("jdbc:mysql://localhost:3306/mybatis")private String url;@Value("root")private String userName;@Value("123456")private String passWord;//1.定义方法获得要管理的对象//2.添加注解@Beanpublic DataSource dataSource(){DruidDataSource ds = new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(passWord);return ds;}
}
5.2.2引用依赖注入
- 引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象
@Beanpublic DataSource dataSource(BookService bookService){DruidDataSource ds = new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(passWord);return ds;}
相关文章:
Spring注解开发,bean的作用范围及生命周期、Spring注解开发依赖注入
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 Spring注解开发 一、注解开发定义Bean二、纯注解开发Bean三…...
C#设计模式之---原型模式
原型模式(Prototype Pattern) 原型模式(Prototype Pattern) 是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种创建型设计模式。也就是用一个已经创建的实例作为原型,通过…...
STM32入门学习之外部中断
1.STM32的IO口可以作为外部中断输入口。本文通过按键按下作为外部中断的输入,点亮LED灯。在STM32的19个外部中断中,0-15为外部IO口的中断输入口。STM32的引脚分别对应着0-15的外部中断线。比如,外部中断线0对应着GPIOA.0-GPIOG.0,…...
Jenkins 配置maven和jdk
前提:服务器已经安装maven和jdk 一、在Jenkins中添加全局变量 系统管理–>系统配置–>全局属性–>环境变量 添加三个全局变量 JAVA_HOME、MAVEN_HOME、PATH 二、配置maven 系统管理–>全局工具配置–>maven–>新增 新增配置 三、配置JDK 在系统管…...
Leetcode | Binary search | 22. 74. 162. 33. 34. 153.
22. Generate Parentheses 要意识到只要还有左括号,就可以放到path里。只要右括号数量小于左括号,也可以放进去。就是valid的组合。recurse两次 74. Search a 2D Matrix 看成sorted list就好。直接用m*n表示最后一位的index,并且每次只需要 …...
生命在于折腾——面试问题汇总
这里面的问题都是我参加面试时候遇到的问题,大家就这样看吧。 一、个人情况 1、自我介绍 2、为什么离开上一家公司 3、有没有参加过HVV 4、介绍一下上家公司的项目 5、小程序和公众号渗透测试做过么 6、实习工资多少 7、有挖过漏洞么 二、基础知识 1、信息收集的…...
<Java>Map<String,Object>中解析Object类型数据为数组格式
背景: 前端:入参为字符串和数组类型;通过json字符串传给后台, 后台:后台通过工具解析为Map<String,Object>,然后需要解析出Map里面的数组值做操作; 需求: 入参&…...
别再分库分表了,试试TiDB!
什么是NewSQL 传统SQL的问题 升级服务器硬件 数据分片 NoSQL 的问题 优点 缺点 NewSQL 特性 NewSQL 的主要特性 三种SQL的对比 TiDB怎么来的 TiDB社区版和企业版 TIDB核心特性 水平弹性扩展 分布式事务支持 金融级高可用 实时 HTAP 云原生的分布式数据库 高度兼…...
Java进阶之Dump文件初体验
视频地址:https://www.bilibili.com/video/BV1Ak4y137oh 学习文章:https://d9bp4nr5ye.feishu.cn/wiki/VQoAwlzrXiLFZekuLIyc1uK5nqc 最近线上频繁的内存告警,同事A通过分析dump文件解决了这个问题,我当然是不会放过这种学习的机…...
基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
曲线拟合(MATLAB拟合工具箱)位置前馈量计算(压力闭环控制应用)
利用PLC进行压力闭环控制的项目背景介绍请查看下面文章链接,这里不再赘述。 信捷PLC压力闭环控制应用(C语言完整PD、PID源代码)_RXXW_Dor的博客-CSDN博客闭环控制的系列文章,可以查看PID专栏的的系列文章,链接如下:张力控制之速度闭环(速度前馈量计算)_RXXW_Dor的博客-CSD…...
小程序使用echarts
参考文档:echarts官网、echarts-for-weixin 第一步引入组件库,可直接从echarts-for-weixin下载,也可以从echarts官网自定义生成,这里我们就不贴了组件库引入好后,就是页面引用啦,废话不多说,直…...
面向对象——封装
C面向对象的三大特性为:封装、继承、多态 C认为万事万物都皆为对象,对象上有其属性和行为 例如: 人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌… 车也可以作为对象…...
【LeetCode】160.相交链表
题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结…...
【JWT的使用】
文章目录 前言1、用户登录1.1 JWTThreadLocal 2.1 代码实现2.1.1 ThreadLocal工具类2.2.2 定义拦截器2.2.3 注册拦截器 前言 1、用户登录 1.1 JWT JSON Web Token简称JWT,用于对应用程序上用户进行身份验证的标记。使用 JWTS 之后不需要保存用户的 cookie 或其他…...
Python获取音视频时长
Python获取音视频时长 Python获取音视频时长1、安装插件2、获取音视频时长.py3、打包exe4、下载地址 Python获取音视频时长 1、安装插件 pip install moviepy -i https://pypi.tuna.tsinghua.edu.cn/simple2、获取音视频时长.py 上代码:获取音视频时长.py # -*-…...
TCP四次握手为什么客户端等待的时间是2MSL
目录 什么是MSL从第三次握手开始分析总结 什么是MSL MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。 从第三次握手开始分析 第三次握手服务端…...
Android Studio 启用设备远程调试配置完整步聚
启用手机设置->开发者选项-无线调试,然后选择允许 已启用后无线调试变成绿色 ,点击无线调试进入详情页面 点击Android Studio的Device Manager 下的WIFI图标 会弹出下图窗口 打开手机的开发者选项中的WIFI调试(无线调试)下的使用二维码配对设备进行扫描. 设备配对成功后手机…...
玩转LaTeX(三)【数学公式(基础)、矩阵、多行公式】
数学公式基础 导言区(引包) \usepackage{amsmath} %带星号的eqution 正文区 \begin{document}%数学公式初步 \section{简介} \LaTeX{}将排版内容分为文本模式和数学模式。文本模式用于普通文本排版,数学模式用于数学公式排版。 …...
jenkins 配置git
在linux 中输入 保证git 安装成功 git --version使用查看git 安装目录(非源码安装直接用yum 安装的) which gitjenkins 中到 系统管理–>全局工具配置–> Git installations 新建一个项目 选择自由风格 源码管理选择 git 如果使用的是码云&a…...
Shader Graph边缘光原理与实战:从菲涅尔效应到世界空间法线
1. 为什么边缘光不是“加个描边”那么简单——从美术需求到Shader本质的错位“给模型加个边缘光”,听起来像Unity编辑器里拖个组件、点几下鼠标就能搞定的事。我第一次接到这个需求时,美术同学在评审会上甩出一张《原神》角色截图,指着雷电将…...
不止于Windows:用QtService源码打造跨平台(Windows/Linux)守护进程的实践指南
不止于Windows:用QtService源码打造跨平台守护进程的实践指南 在当今多平台开发环境中,Qt框架因其卓越的跨平台能力而备受青睐。但当我们从GUI应用转向后台服务开发时,许多开发者会发现一个尴尬的现实:Windows服务与Linux守护进程…...
WarcraftHelper:5分钟解决魔兽争霸III现代兼容性问题的终极指南
WarcraftHelper:5分钟解决魔兽争霸III现代兼容性问题的终极指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸III在W…...
用随机森林实现手写大写字母识别的完整实践
1. 项目概述:用随机森林搞定手写信件识别,这事儿比你想象中更接地气 “How To Perform Letter Recognition in Python Using Random Forest Classifier”——这个标题乍看像教科书里的章节名,但实际拆开来看,它直指一个非常典型、…...
CUDA为什么能统治AI世界?NVIDIA真正可怕的并不是GPU
前言很多人第一次接触AI行业时,都会听到一个词:CUDA。而且你会发现一个非常奇怪的现象:很多AI框架、深度学习项目、GPU训练环境,几乎都默认要求:NVIDIA显卡CUDA环境甚至很多时候:没有CUDA,AI项目…...
效率直接起飞 2026 最新!降AIGC工具测评与推荐
2026年真正好用的AI论文降重与改写工具,核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...
【下载安装教程】仿宋GB2312、楷体GB2312和方正小标宋简体办公字体安装包下载安装教程
常用办公字体安装与使用指南 适用字体及场景 字体名称适用场景仿宋_GB2312正文内容、正式文档楷体_GB2312批注、说明性文字方正小标宋简体标题、封面文字、强调性内容 支持软件 WPSMicrosoft WordPowerPoint其他主流办公软件 使用方法 安装字体 下载字体文件(.…...
终极游戏模组管理指南:Nexus Mods App如何让你轻松玩转模组世界
终极游戏模组管理指南:Nexus Mods App如何让你轻松玩转模组世界 【免费下载链接】NexusMods.App Home of the development of the Nexus Mods App 项目地址: https://gitcode.com/gh_mirrors/ne/NexusMods.App 厌倦了手动安装模组时的各种冲突和兼容性问题&a…...
如何快速搭建个人游戏串流服务器:Sunshine跨平台游戏流媒体完整指南
如何快速搭建个人游戏串流服务器:Sunshine跨平台游戏流媒体完整指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上畅玩PC游戏?Sunshine游…...
ESXi 9.0.0 HPE原厂定制版深度解析|专属硬件适配+零报错部署指南,HPE服务器运维最优解
随着vSphere 9.0虚拟化架构全面普及,企业HPE慧与服务器的底层虚拟化部署迎来全新升级需求。普通通用版ESXi镜像在HPE ProLiant、Apollo系列服务器中,常出现网卡不认、RAID驱动缺失、iLO管理异常、硬件兼容报错等问题,严重影响生产部署效率与系…...
