Spring专家课程Day02_Spring-DI

news2024/11/20 3:18:11

文章目录

  • 一、依赖注入_Autowired
    • 1.配置类中@Bean 方式注入
      • 1.1)注入实例
      • 1.2)自动注入的匹配原则
    • 2.组件扫描实现自动注入 @Autowired
    • 3.set方法注入
  • 二、接口解耦_自动注入规则
    • 1)利用接口解耦
    • 2)@Autowired的注入规则
    • 3)@Qualifier注解在调用类中指定对应的组件
  • 三、同时使用@Bean和@Component_Druid连接池
    • 1.@Bean和@Component同时使用
    • 2、Druid
      • 2.1)Druid数据库连接池
      • 2.2)示例
  • 四、读取Properties_@Value
    • 1.properties文件env读取
    • 2.@Value读取配置
      • 2.1 @Value放在形参中配置
  • 总结:
    • 1.工作中@Bean麻烦,@Component使用更多
    • 2. String sql1="select 'Hello Druid'"; 可测试数据库连接情况;
    • 3.[Druid和HikariCP对比](https://blog.csdn.net/weixin_38943725/article/details/122716340)
      • 3.1 性能方面:HikariCP因为细节方面优化力度较大,性能方面强于Druid
      • 3.2 功能丰富程度方面:Druid功能更全面除了具有连接池的基本功能以外,还支持sql级监控,支持扩展,防止SQL注入等功能。
      • 3.3 使用热度:Druid在国内使用较多,国内有很多生产实践。HikariCP是spring boot 2.0以后默认连接池,在国外使用较多。

一、依赖注入_Autowired

1.配置类中@Bean 方式注入

1.1)注入实例

在这里插入图片描述
配置类:

public class Config {

    @Bean
    public Saw saw(){
        return new Saw();
    }

    @Bean
    public Worker worker(Saw saw){
        Worker worker=new Worker();
        worker.saw = saw;
        return worker;
    }
}

1.2)自动注入的匹配原则

在这里插入图片描述
在这里插入图片描述

2.组件扫描实现自动注入 @Autowired

配置类:

@Configuration
@ComponentScan(basePackages = "cn.tedu.demo")

public class Config {
 
}

Saw组件类:

@Component
public class Saw implements Serializable {
    String name="寒冰锯";

    @Override
    public String toString() {
        return name;
    }
}

Woker组件类:

@Component
public class Worker implements Serializable {
    String name="光头强";

    @Autowired
    public Saw saw;

    public void work(){
        System.out.println(name+"使用..."+saw+"...砍树");
    }
}

3.set方法注入

在这里插入图片描述

二、接口解耦_自动注入规则

1)利用接口解耦

在这里插入图片描述
在这里插入图片描述
那个类上使用了@Component标注,Tool就指向那个
在这里插入图片描述
配置类:

@Configuration
@ComponentScan(basePackages = "cn.tedu.demo")

public class Config {

}

2)@Autowired的注入规则

组件上面都加@Component的情况,
在这里插入图片描述
在这里插入图片描述

3)@Qualifier注解在调用类中指定对应的组件

组件类都是@Component
在这里插入图片描述

三、同时使用@Bean和@Component_Druid连接池

1.@Bean和@Component同时使用

@Bean组件注入到@Component;
@Component组件注入到@Bean;
以上两种情况都可以;

Config配置类:

@Configuration
public class SysConfig {

    @Bean
    public Date myDate(){
        return new Date();
    }
}

Worker组件类:

@Component
public class Worker implements Serializable {
    String name="光头强";

    @Autowired
    @Qualifier("axe")
    public Tool tool;

    @Autowired
    private Date dt; 
    
    public void work(){
        System.out.println(name+"使用..."+tool+"...砍树");
        System.out.println(dt);
    }
}

2、Druid

2.1)Druid数据库连接池

在这里插入图片描述

2.2)示例

POM配置

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.15</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

Config类配置:

@Configuration
@ComponentScan(basePackages = "cn.tedu.demo")

public class Config {

    @Bean(initMethod="init", destroyMethod="close")
    public DataSource dataSource(){
        DruidDataSource dt =new DruidDataSource();
        dt.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dt.setUrl("jdbc:mysql://localhost:3306/tedu?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true");
        dt.setUsername("root");
        dt.setPassword("root");
        dt.setMaxActive(10);
        dt.setInitialSize(2);
        return dt;
    }
}

测试类代码:

    @Test
    public void testDruid(){
        DataSource ds = ctx.getBean("dataSource", DataSource.class);
        try(Connection conn = ds.getConnection()) {
            String sql="select * from student";
            Statement st= conn.createStatement();
            ResultSet rs=st.executeQuery(sql);
            while (rs.next()){
                System.out.println(rs.getString(2));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

四、读取Properties_@Value

1.properties文件env读取

配置类代码:

@Configuration
@ComponentScan(basePackages = "cn.tedu.demo")
@PropertySource("classpath:jdbc.properties")
public class Config {

    @Autowired
    Environment env;

    @Bean(initMethod = "init", destroyMethod = "close")
    public DataSource dataSource(){
        DruidDataSource dt =new DruidDataSource();
        dt.setDriverClassName(env.getProperty("db.driver"));
        dt.setUrl(env.getProperty("db.url"));
        dt.setUsername(env.getProperty("db.username"));
        dt.setPassword(env.getProperty("db.password"));
        dt.setMaxActive(env.getProperty("db.maxActive",Integer.class));
        dt.setInitialSize(env.getProperty("db.initSize",Integer.class));
        return dt;
    }
}

jdbc.properties代码:

db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/tedu?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
db.username=root
db.password=root
db.maxActive=10
db.initialSize=2

2.@Value读取配置

2.1 @Value放在形参中配置

配置类:

@Configuration
@ComponentScan(basePackages = "cn.tedu.demo")
@PropertySource("classpath:jdbc.properties")
public class Config {

    @Autowired
    Environment env;

    @Bean(initMethod = "init", destroyMethod = "close")
    public DataSource dataSource(
        @Value("${db.driver}") String driver,
        @Value("${db.url}") String url,
        @Value("${db.username}") String username,
        @Value("${db.password}") String password,
        @Value("${db.maxActive}") int maxActive,
        @Value("${db.initSize}") int initSize){

        DruidDataSource dt =new DruidDataSource();
        dt.setDriverClassName(driver);
        dt.setUrl(url);
        dt.setUsername(username);
        dt.setPassword(password);
        dt.setMaxActive(maxActive);
        dt.setInitialSize(initSize);
        return dt;
    }
}

总结:

1.工作中@Bean麻烦,@Component使用更多

2. String sql1=“select ‘Hello Druid’”; 可测试数据库连接情况;

3.Druid和HikariCP对比

3.1 性能方面:HikariCP因为细节方面优化力度较大,性能方面强于Druid

3.2 功能丰富程度方面:Druid功能更全面除了具有连接池的基本功能以外,还支持sql级监控,支持扩展,防止SQL注入等功能。

3.3 使用热度:Druid在国内使用较多,国内有很多生产实践。HikariCP是spring boot 2.0以后默认连接池,在国外使用较多。

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

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

相关文章

学高性能计算难吗?猿代码科技国内首家专注高性能计算人才培养与推荐 ...

高性能计算&#xff08;HPC&#xff09;作为一门专业领域&#xff0c;涉及到复杂的计算架构、并行计算模型和算法优化等方面的知识。因此&#xff0c;学习高性能计算可能对一些人来说是一项挑战。然而&#xff0c;随着正确的学习方法和适当的资源&#xff0c;掌握高性能计算并不…

【UCOS-III】自我学习笔记→第35讲→软件定时器实验

文章目录 前言实验步骤1.复制消息队列工程&#xff0c;并创建单次定时器和周期定时器&#xff0c;并删除task3及其相关内容2.添加task1按键处理和软件定时器超时函数3.查看串口现象 测试代码工程文件总结 前言 无&#xff0c;仅作记录&#xff0c;不具有参考价值&#xff0c;所…

【MATLAB第43期】基于MATLAB的BO-NAR贝叶斯优化动态神经网络NAR时间序列股票预测模型

【MATLAB第43期】基于MATLAB的BO-NAR贝叶斯优化动态神经网络NAR时间序列股票预测模型 一、效果展示 二、模型介绍 1.数据情况 一列数据&#xff0c;499个值 ratio 0.9;% 训练集比例 MaxEpochs 600;% 最大训练次数 % % 导入股票数据 xall importdata(数据.xlsx);2.优化参…

MySQL MMM 双主架构 主主复制 高可用

MMM&#xff08;Master-Master replication manager for MvSQL&#xff0c;MySQL主主复制管理器&#xff09; 是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发&#xff0c;主要用来监控和管理 MySQL Master-Master &#xff08;双主&#xff09;复制&…

全志V3S嵌入式驱动开发(windows平台镜像烧入)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于很多第一次学习嵌入式linux和开发板的同学来说&#xff0c;如何烧入镜像文件常常成为他们要面对的第一个难题。从拿到板子开始&#xff0c;他们…

每个前端开发者都应知道的25个实用网站

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 快来免费体验ChatGpt plus版本的&#xff0c;我们出的钱 体验地…

Soybean Admin - 基于 Vue3 / vite3 等最新前端技术栈构建的中后台模板,免费开源、清新优雅,主题丰富

一款专业好看、完成度很高的 admin 开源项目&#xff0c;无论是用于生产还是学习&#xff0c;都非常值得尝试。 关于 Soybean Admin Soybean Admin 是一个基于 Vue3 / Vite3 / TypeScript / NaiveUI / Pinia 和 UnoCSS 的中后台模版&#xff0c;它使用了最新流行的前端技术栈…

poium测试库介绍

poium测试库前身为selenium-page-objects测试库&#xff0c;我在以前的文章中也有介绍过:这可能是最简单的Page Object库&#xff0c;项目的核心是基于Page Objects实现元素定位的封装。该项目由我个人在维护&#xff0c;目前在公司项目中已经得到的应用。 ### poium的优势 Pa…

cmd和android studio同时使用adb,解决冲突的方案

问题&#xff1a; android studio 在Terminal使用adb后&#xff0c;cmd的adb就会掉线&#xff1b;同样cmd的adb使用中&#xff0c;android studio的logcat 的设备就是Offline状态&#xff0c;得重新在Terminal adb connect&#xff0c;并且关闭掉cmd窗口&#xff0c;否则adb反…

Centos ifconfig不显示IP地址解决办法之一

虚拟机使用命令ifconfig不显示IP地址&#xff0c;情况如下 原因&#xff1a;我们的虚拟机网络服务没有设置为开机自启动 解决&#xff1a; 1&#xff0c;进入目录 /etc/sysconfig/network-scripts/ cd /etc/sysconfig/network-scripts/ 2&#xff0c;路径下有一个 ifcfg-en…

4.蜂鸣器

1.了解蜂鸣器&#xff1a; 蜂鸣器在使用3.3V无法驱动&#xff0c;需要借助到三极管的放大特性(IcβIb)将蜂鸣器驱动&#xff1b;本次原理图中&#xff0c;接R33电阻是因为当STM32单片机复位时处于浮空状态&#xff0c;防止小电流让蜂鸣器响而添加的。 2.蜂鸣器原理图&#xf…

十一、jenkins将构建时间作为Jenkins变量(BUILD_TIMESTAMP)

插件管理中安装Build Timestamp 插件后可以使用 构建时间变量&#xff0c;变量名称【BUILD_TIMESTAMP】 引用变量方法&#xff1a; linux : ${BUILD_TIMESTAMP} 或 $BUILD_TIMESTAMP 推荐使用 ${BUILD_TIMESTAMP} Windows&#xff1a; %BUILD_TIMESTAMP%

TypeScript——泛型

泛型&#xff08;Generics&#xff09;是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性。 函数泛型 本来函数参数类型的不同时&#xff0c;要写多个&#xff0c;现在用泛型&#xff0c;只需要使用时传参即可…

android studio 一直卡在Build android:Download maven-metadata.xml

在android studio进行此操作&#xff0c;关闭gradle的联网功能

使用MM32L0130和HYS1254的电子秤方案验证

使用MM32L0130和HYS1254的电子秤方案验证 文章目录 使用MM32L0130和HYS1254的电子秤方案验证引言电路设计软件设计采集HYS1254数据软件滤波算法换算压力为ADC采样值 实验过程数据可视化优化电路使用软件滤波降低ADC的采样速率使用独立的供电电源再次调整滤波算法 验证总结参考文…

M1 macbook上安装docker 编译内核 并使用qemu启动内核。

1、在M1上安装docker这个就不用提供步骤了&#xff0c;网上自行搜索。 2、在M1上pull一个ubuntu的容器。docker pull ubuntu:18.04 docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 d1a528908992 …

python实现Edge的爬虫

python实现Edge的爬虫 查看Edge的版本号 下载对应的驱动 官网驱动链接: link 根据自己的系统选择相应的驱动 解压后放在自己的python的Scripts路径&#xff0c;并改名为 MicrosoftWebDriver 安装python库 常用的爬虫库&#xff1a; from bs4 import BeautifulSoup import …

回归预测 | MATLAB实现基于QPSO-GRU、PSO-GRU、GRU多变量回归预测

回归预测 | MATLAB实现基于QPSO-GRU、PSO-GRU、GRU多变量回归预测 目录 回归预测 | MATLAB实现基于QPSO-GRU、PSO-GRU、GRU多变量回归预测效果一览基本描述程序设计参考资料 效果一览 基本描述 1.Matlab实现QPSO-GRU、PSO-GRU和GRU门控循环单元多变量回归预测&#xff1b; 2.输…

Word中页码变成 {PAGE \* MERGEFORMAT}

今天在写材料的时候Word突然就完蛋了&#xff0c;页码什么的出现乱码了&#xff0c;然后就搜索了一下&#xff0c;找到了解决办法&#xff0c;这里记录一下&#xff0c;方便以后查阅。 Word中页码变成 {PAGE \* MERGEFORMAT}

AndroidTV开发14优雅地实现TV端超长巨图加载

AndroidTV开发14优雅地实现TV端超长巨图加载 1.前言 之前在Android和Vue端都实现过长图加载&#xff0c;虽然实现需求&#xff0c;但是有很多问题没有解决&#xff0c;效果也不尽人意今天就各种问题来分析一下&#xff1a; 图片加载时清晰度不是很好&#xff0c;会失真的情况…