【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://xiahunao.cn/news/2803028.html

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

相关文章

防御保护---内容过滤技术

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.防火墙内容过滤技术概述 内容过滤技过检查网络流量中的数据包内容&#xff0c;对不符合预订策略的文件类型/文件的上传下载/承载文件的协议和应用进行过滤和阻止&#xff0c;以确保网络安全。…

CSS浮动与定位

行内元素和块级元素的区别&#xff1a;&#xff08;非常重要&#xff09; 行内元素&#xff1a; 与其他行内元素并排&#xff1b;不能设置宽、高。默认的宽度&#xff0c;就是文字的宽度。 块级元素&#xff1a; 霸占一行&#xff0c;不能与其他任何元素并列&#xff1b;能…

华为算法题 go语言或者ptython

1 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返…

PostgreSQL 实体化视图的使用

上周的教程中&#xff0c;通过 DVD Rental Database 示例&#xff0c;让我们了解了在 PostgreSQL 中创建实体化视图的过程。正如我们所了解的&#xff0c;PostgreSQL 实体化视图提供了一种强大的机制&#xff0c;通过预计算和存储查询结果集为物理表来提高查询性能。接下来的内…

轻松掌握opencv的8种图像变换

文章目录 opencv的8种图像变换1. 图像放大、缩小2. 图像平移3. 图像旋转4. 图像仿射变换5. 图像裁剪6. 图像的位运算&#xff08;AND, OR, XOR&#xff09;7. 图像的分离和融合8. 图像的颜色空间 opencv的8种图像变换 1. 图像放大、缩小 我们先看下原图 import cv2 import ma…

HTTP基本概念-HTTP 常见的状态码有哪些?

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) HTTP 常见的状态码有哪些? 1xx 类状态码属于提示信息&#xff0c;是协议处理中的一种中间状态&#xff0c;实际用到的比较少。 2xx 类状态码表示服务器成功处理了客户端的请求&#xff0c;也是我们最愿…

【stm32】hal库-双通道ADC采集

【stm32】hal库-双通道ADC采集 CubeMX图形化配置 程序编写 /* USER CODE BEGIN PV */ #define BATCH_DATA_LEN 1 uint32_t dmaDataBuffer[BATCH_DATA_LEN]; /* USER CODE END PV *//* USER CODE BEGIN 2 */lcd_init();lcd_show_str(10, 10, 24, "Demo14_4:ADC1 ADC2 S…

vue后台管理添加水印简单方式watermark-package

详情参考:https://www.npmjs.com/package/watermark-package 示例方法 <el-button type"primary" click"AddWatermark">添加水印</el-button><el-button type"primary" click"RemoveWatermark">清除水印</el-but…

k8s-heml管理 17

Helm是Kubernetes 应用的包管理工具&#xff0c;主要用来管理 Charts&#xff0c;类似Linux系统的 yum。Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata&#xff0c;以便于应用程序的分发。 对于应用…

关于el-select值的回显问题 : 框内显示label值还是value值

<el-form-item label"状态" prop""><el-selectv-model"roleForm.state"class"m-2"size"large"style"width: 240px"placeholder"请选择状态"value-key"value"//value-key 与下面的ke…

CleanMyMac X2024告别硬盘空间不足,让您的Mac电脑极速如新

CleanMyMac X支持多种操作系统版本&#xff0c;包括macOS 10.10&#xff08;Yosemite&#xff09;、macOS 10.11&#xff08;El Capitan&#xff09;、macOS 10.12&#xff08;Sierra&#xff09;、macOS 10.13&#xff08;High Sierra&#xff09;、macOS 10.14&#xff08;Mo…

多输入时序预测|GWO-CNN-LSTM|灰狼算法优化的卷积-长短期神经网络时序预测(Matlab)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 灰狼优化算法&#xff1a; 卷积神经网络-长短期记忆网络&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容…

解决IntelliJ IDEA 2023版本创建Spring项目时Java只能选择17或21的问题

问题描述&#xff1a; 当使用IntelliJ IDEA2023版本中Spring Initializr新建Spring项目时&#xff0c;即使JDK配置项为1.8&#xff0c;Java配置项仍然只能选17或21. 在JDK为1.8版本情况下&#xff0c;Java选择17或21&#xff0c;点击NEXT按钮&#xff0c;则会弹窗提示SDK不支持…

如何打造品牌的专属记忆点?媒介盒子支招

传播环境不断改变&#xff0c;品牌运营的方式也需要不断更新&#xff0c;碎片化“短平快”营销也许能短暂的占据大众视野&#xff0c;但并非品牌的长效致胜法宝。实现品牌价值长效增长的核心技巧就在于打造品牌的专属记忆点&#xff0c;那么如何通过打造记忆点来破开品牌的同质…

互动游戏团队如何将性能体验优化做到TOP级别

一、背景 随着互动游戏业务 DAU 量级增加&#xff0c;性能和体验重要性也越发重要&#xff0c;好的性能和体验不仅可以增加用户使用体感&#xff0c;也可以增加用户对于互动游戏的使用粘性。 对现状分析&#xff0c;主要存在首屏渲染速度慢、打开页面存在白屏、页面加载过多资…

二叉树中的第K大层和

1.题目 这道题是2024-2-23的签到题&#xff0c;题目难度为中等。 考察知识点为BFS算法&#xff08;树的层序遍历&#xff09; 大根堆&#xff08;优先队列&#xff09;。 题目链接&#xff1a;2583. 二叉树中的第 K 大层和 - 力扣&#xff08;LeetCode&#xff09; 给你一棵…

云服务器发展史

在数字化浪潮的推动下&#xff0c;云服务器作为信息技术领域的一颗璀璨明珠&#xff0c;其发展史是一部科技进步和创新思维的缩影。从最初的概念提出到现如今的广泛应用&#xff0c;云服务器经历了翻天覆地的变化&#xff0c;不仅极大地推动了信息技术的发展&#xff0c;也彻底…

微服务架构师封神之路13-RabbitMQ集群与高可用|RabbitMQ clustering and HA

目录 几个关键技术点 节点间相互验证&#xff0c;.erlang.cookie nodename的唯一性 port冲突与配置 Management UI plugin安装 Queue&#xff08;message&#xff09;replicas Queue leader strategy 配置文件详细 Node 1 Installation path .erlang.cookie rabbit…

图片水印怎么去除?两招教会你去水印不留痕

在数字世界的繁华中&#xff0c;图片如诗如画&#xff0c;诉说着千言万语。然而&#xff0c;水印的存在&#xff0c;就像一层薄雾&#xff0c;遮挡了图像的纯净与真实。它们不仅影响了图片的美观&#xff0c;还限制了我们对图像的想象与创作。今天给大家推荐几个图片去水印的工…

CentOS使用Docker搭建Halo网站并实现无公网ip远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…