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…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
