【Spring】IoC容器 控制反转 与 DI依赖注入 配置类实现版本 第四期

文章目录

  • 基于 配置类 方式管理 Bean
  • 一、 配置类和扫描注解
  • 二、@Bean定义组件
  • 三、高级特性:@Bean注解细节
  • 四、高级特性:@Import扩展
  • 五、基于注解+配置类方式整合三层架构组件
  • 总结


基于 配置类 方式管理 Bean

  • Spring 完全注解配置(Fully Annotation-based Configuration)是指通过 Java配置类 代码来配置 Spring 应用程序,使用注解来替代原本在 XML 配置文件中的配置。
  • 相对于 XML 配置,完全注解配置具有更强的类型安全性和更好的可读性。

从 xml 到 完全注解 配置!
1

一、 配置类和扫描注解

1

//使用注解读取外部配置,替代 <context:property-placeholder标签
@PropertySource("classpath:jdbc.properties")
//使用@ComponentScan注解,可以配置扫描包,替代<context:component-scan标签
@ComponentScan("com.doug.ioc01")
//标注当前类是配置类,替代application.xml 
@Configuration
public class javaConfiguration {/**  1. 添加@Configuration 标识为配置类*  2. 包扫描注解配置:*       2.1 @ComponentScan({"com.doug.ioc01","com.doug.ioc02"}) 多个包 中括号+逗号分割*       2.2 引用外部配置文件  *       2.3 声明第三方依赖的bean组件* */
}

测试:

    @Testpublic void testIoc_01(){// AnnotationConfigApplicationContext 根据配置类创建 IOC 容器对象AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(javaConfiguration.class);StuController bean = context.getBean(StuController.class);bean.show();}

也可以使用 no-arg 构造函数实例化 AnnotationConfigApplicationContext ,然后使用 register() 方法对其进行配置。

// AnnotationConfigApplicationContext-IOC容器对象
ApplicationContext iocContainerAnnotation = 
new AnnotationConfigApplicationContext();
//外部设置配置类
iocContainerAnnotation.register(MyConfiguration.class);
//刷新后方可生效!!
iocContainerAnnotation.refresh();
  • @Configuration指定一个类为配置类,可以添加配置注解,替代配置xml文件
  • @ComponentScan(basePackages = {“包”,“包”}) 替代<context:component-scan标签实现注解扫描
  • @PropertySource(“classpath:配置文件地址”) 替代 <context:property-placeholder标签
  • 配合IoC/DI注解,可以进行完整注解开发!

二、@Bean定义组件

`

属性只在当前方法使用,直接写成形参

//标注当前类是配置类,替代application.xml    
@Configuration
//引入jdbc.properties文件
@PropertySource({"classpath:application.properties","classpath:jdbc.properties"})
@ComponentScan(basePackages = {"com.doug.components"})
public class MyConfiguration {//如果第三方类进行IoC管理,无法直接使用@Component相关注解//解决方案: xml方式可以使用<bean标签//解决方案: 配置类方式,可以使用方法返回值+@Bean注解@Beanpublic DataSource createDataSource(@Value("${jdbc.user}") String username,@Value("${jdbc.password}")String password,@Value("${jdbc.url}")String url,@Value("${jdbc.driver}")String driverClassName){//使用Java代码实例化DruidDataSource dataSource = new DruidDataSource();dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setUrl(url);dataSource.setDriverClassName(driverClassName);//返回结果即可return dataSource;}
}

三、高级特性:@Bean注解细节

    /** @Bean会真正让配置类的方法创建的组件存储到IOC容器** 1. beanName*       默认:方法名*       指定:name/value 属性起名字,覆盖方法名** 2. 周期方法指定*       原有注解方法:PostConstruct + PreDestroy*       bean属性指定:initMethod / destroyMethod** 3.作用域*       @Scope 默认单例** 4.如何引用其他ioc组件*       直接调用对方的bean方法*       直接形参变量引入,要就必须有对应组件,如有多个,形参名 = 组件id标识 即可* */@Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)@Bean(name = "dataSource",initMethod = "",destroyMethod = "")public DataSource createDataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(driver);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}@Bean(name = "dougSource")public DataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(driver);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}/*** 方法一:*   直接把方法引入* @return*/@Beanpublic JdbcTemplate jdbcTemplate(){JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(createDataSource());return jdbcTemplate;}/*** 方法二:*   使用形参的方式,IOC容器会自动装配,可以一个或多个* @return*/@Beanpublic JdbcTemplate jdbcTemplate2(DataSource dataSource){JdbcTemplate jdbcTemplate = new JdbcTemplate();//使用形参的方法,就必须要有这个类型的参数已经被注入了,// 就是上面的createDataSource方法被@Bean注解标识了(没有标注是会报错的)jdbcTemplate.setDataSource(dataSource);return jdbcTemplate;}/*** 如果是多个形参的情况,根据传入参数的名字对应bean设置的name,选择*/@Beanpublic JdbcTemplate jdbcTemplate3(DataSource dataSource,DataSource dougSource){JdbcTemplate jdbcTemplate = new JdbcTemplate();//使用形参的方法,就必须要有这个类型的参数已经被注入了,// 就是上面的createDataSource方法被@Bean注解标识了(没有标注是会报错的)// 如果是多个形参的情况,根据传入参数的名字对应bean设置的name,选择jdbcTemplate.setDataSource(dougSource);return jdbcTemplate;}

四、高级特性:@Import扩展

@Import 注释允许从另一个配置类加载 @Bean 定义
也就是 :
当有A B两个配置类, A中引入@ImportB
在实例化配置类时 , 只要引入A就可以,B会跟着一起。

@Configuration
public class ConfigA {@Beanpublic A a() {return new A();}
}@Configuration
@Import(ConfigA.class)
public class ConfigB {@Beanpublic B b() {return new B();}
}

容器实例化只需要引入 ConfigB.class (但是AB都可以用);

在实例化上下文时不需要同时指定 ConfigA.classConfigB.class ,只需显式提供 ConfigB

public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class);// now both beans A and B will be available...A a = ctx.getBean(A.class);B b = ctx.getBean(B.class);
}

此方法简化了容器实例化,因为只需要处理一个类,而不是要求在构造期间记住可能大量的 @Configuration 类。

五、基于注解+配置类方式整合三层架构组件

将原xml 配置第三方类 都使用 配置类来写,其余用都用注解,也就是完全注解开发,舍弃了在xml里面配置

配置类:

@PropertySource("classpath:jdbc.properties")
@ComponentScan("com.doug")
@Configuration
public class MyConfiguration {@Beanpublic DataSource dataSource(@Value("${doug.url}") String url, @Value("${doug.driver}") String driver,@Value("${doug.username}") String username, @Value("${doug.password}") String password) {DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(driver);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource) {JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(dataSource);return jdbcTemplate;}
}

1


总结

1
注解+配置类 IoC方式总结

  1. 完全摒弃了XML配置文件
  2. 自定义类使用IoC和DI注解标记
  3. 第三方类使用配置类声明方法+@Bean方式处理
  4. 完全注解方式(配置类+注解)是现在主流配置方式

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

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

相关文章

AndroidStudio 2024-2-21 Win10/11最新安装配置(Kotlin快速构建配置,gradle镜像源)

AndroidStudio 2024 Win10/11最新安装配置 教程目的&#xff1a; (从安装到卸载) &#xff0c;针对Kotlin开发配置&#xff0c;gradle-8.2-src/bin下载慢&#xff0c;以及Kotlin构建慢的解决 好久没玩AS了,下载发现装个AS很麻烦,就觉得有必要出个教程了(就是记录一下:嘻嘻) 因…

MariaDB落幕和思考

听过MySQL的基本也都知道 MariaDB。MariaDB由MySQL的创始人主导开发&#xff0c;他早前曾以10亿美元的价格&#xff0c;将自己创建的公司MySQL AB卖给了SUN&#xff0c;此后&#xff0c;随着SUN被甲骨文收购&#xff0c;MySQL的所有权也落入Oracle的手中。传闻MySQL的创始人担心…

vue封装el-table表格组件

先上效果图&#xff1a; 本文包含了具名插槽、作用域插槽、jsx语法三种&#xff1a; Render.vue&#xff08;很重要&#xff0c;必须有&#xff09;: <script> export default {name: "FreeRender",functional: true,props: {scope:Object,render: Functio…

我把springboot项目从Java 8 升级 到了Java 17 的过程总结,愿为君提前踩坑!

项目从jdk8升级到jdk17&#xff0c;我不是为了追求java 17的新特性&#xff08;准确来说也还没有去了解有什么新特性&#xff09;&#xff0c;也不是为了准确与时俱进&#xff0c;永远走在java行列的最前端&#xff0c;纯粹因为项目需要&#xff0c;因为我们都知道&#xff0c;…

【医学大模型 补全主诉】BioGPT + LSTM 自动补全医院紧急部门主诉

BioGPT LSTM 自动补全医院紧急部门主诉 问题&#xff1a;针对在紧急部门中自动补全主诉的问题子问题1: 提高主诉记录的准确性子问题2: 加快主诉记录的速度子问题3: 统一医疗术语的使用子问题4: 减少打字错误和误解子问题5: 提高非特定主诉的处理能力 解法数据预处理神经网络方…

微服务篇之限流

一、为什么要限流 1. 并发的确大&#xff08;突发流量&#xff09;。 2. 防止用户恶意刷接口。 二、限流的实现方式 1. Tomcat限流 可以设置最大连接数&#xff0c;但是每一个微服务都有一个tomcat&#xff0c;实现起来非常麻烦。 2. Nginx限流 &#xff08;1&#xff09;控…

十大基础排序算法

排序算法分类 排序&#xff1a;将一组对象按照某种逻辑顺序重新排列的过程。 按照待排序数据的规模分为&#xff1a; 内部排序&#xff1a;数据量不大&#xff0c;全部存在内存中&#xff1b;外部排序&#xff1a;数据量很大&#xff0c;无法一次性全部存在内存中&#xff0c;…

利用Ubuntu22.04启动U盘对电脑磁盘进行格式化

概要&#xff1a; 本篇演示利用Ubuntu22.04启动U盘的Try Ubuntu模式对电脑磁盘进行格式化 一、说明 1、电脑 笔者的电脑品牌是acer(宏碁/宏基) 开机按F2进入BIOS 开机按F12进入Boot Manager 2、Ubuntu22.04启动U盘 制作方法参考笔者的文章&#xff1a; Ubuntu制作Ubun…

每日学习总结20240222

每日总结 一旦停下来太久&#xff0c;就很难继续了 ——《一个人的朝圣》 20240222 1. 自定义逻辑 请设计一个函数single_track_logic,传入三个参数&#xff0c;第一个参数是int数组&#xff0c;第二个参数是一个int变量&#xff0c;第三个参数是一个以int为返回值&#xff0c…

dell r740服务器黄灯闪烁维修现场解决

1&#xff1a;首先看一下这款DELL非常主力的PowerEdge R740服务器长啥样&#xff0c;不得不说就外观来说自从IBM抛弃System X系列服务器后&#xff0c;也就戴尔这个外观看的比较顺眼。 图一&#xff1a;是DELL R740前视图&#xff08;这款是8盘机型&#xff09; 图二&#xff…

SICTF Round#3 wp web

web hacker sql无列名注入&#xff1b; 提示查询username参数&#xff0c;flag在flag表中&#xff1b; 传参测试发现&#xff0c;union select 可用&#xff0c;空格被过滤可以使用/**/代替 &#xff0c;or也被过滤了且无法大小写、双写等绕过&#xff0c;导致无法查询flag表…

Python实战:读取MATLAB文件数据(.mat文件)

Python实战&#xff1a;读取MATLAB文件数据(.mat文件) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅…

Leetcoder Day18| 二叉树 part07

语言&#xff1a;Java/Go 今天做了一个小决定&#xff0c;如果时间不够的话&#xff0c;可以先看go去找实习&#xff0c;所以现在加上用go去刷题 530.二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。…

常见锁策略,CAS,synchrodized原理讲解

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 常见锁策略 乐观锁和悲观锁 轻量级锁和重量级锁 自旋锁和挂起等待锁 读写锁 公平锁和非公平锁…

10大互联网技术受益于这个行业,它甚至推动互联网诞生

hello&#xff0c;我是贝格前端工场&#xff0c;今天分享某个行业存进了互联网技术发展&#xff0c;最早的互联网也是从该行业诞生的&#xff0c;希望老铁们喜欢&#xff0c;别忘了关注、点赞、评论、转发。 ARPANET 互联网的前身ARPANET最初是由美国国防部高级研究计划局&…

【云动世纪:Apache Doris 技术之光】

本文节选自《基础软件之路&#xff1a;企业级实践及开源之路》一书&#xff0c;该书集结了中国几乎所有主流基础软件企业的实践案例&#xff0c;由 28 位知名专家共同编写&#xff0c;系统剖析了基础软件发展趋势、四大基础软件&#xff08;数据库、操作系统、编程语言与中间件…

[力扣 Hot100]Day33 排序链表

题目描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 出处 思路 归并排序即可。 代码 class Solution { public:ListNode* merge(ListNode *h1,ListNode *h2) {ListNode *head nullptr;if(h1->val<h2->val){head h1;h1h1-…

SQL面试题及答案

介绍 在快节奏的数据管理和信息技术世界中,导航和操作结构化数据的能力是一项非常重要的技能。SQL,即结构化查询语言,是关系数据库的基石,掌握这种语言的专业人员的需求量很大。SQL 面试在科技行业很常见,潜在的候选人会接受测试以展示他们的知识和解决问题的能力。为了帮…

远程连接 vscode 出错 “远程主机可能不符合 glibc 和 libstdc++ VS Code 服务器的先决条件”

原因&#xff1a; vscode 版本是 1.86&#xff0c;服务器上的 glibc 和 libstdc 版本不满足 要求(2.28 和 3.4.25)。 解决&#xff1a; 1、下载 1.85.2&#xff0c;解压直接运行 Code.exe。 2、回退 Remote-ssh 到 0.107.1。 参考&#xff1a; vscode 1.86版本远程ssh不兼容旧…

java八股 redis

缓存穿透&#xff1f;如何解决&#xff1f; 缓存穿透是指查询一个一定不存在的数据&#xff0c;如果从存储层查不到数据&#xff0c;则不写入缓存&#xff0c;这就导致这个不存在的数据每次都要去数据库中查询&#xff0c;可能导致数据库挂掉。 可以通过布隆过滤器来解决。布隆…