Spring 学习笔记2

news2025/1/21 17:47:39

1.spring设置JDBC链接池
classpath:jdbc.properties是有多个连接池时的写法,一般都用这种
还有就是配置文件里不要直接使用username,会被覆盖
使用${}来从文件里读取属性

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">


    <!--1. 加载jdbc.properties配置文件
        如果需要使用properties文件的值: ${properties的key}

        注意:spring在启动的时候是会读取你的系统的用户名,并且使用username作为用户名的key。
        所以就会出现覆盖你的用户名。

        解决方案:
            方案一:system-properties-mode="NEVER"  不使用系统的用户名
            方案二:你的properties的username不要使用username,换一个名字。
    -->
    <context:property-placeholder  location="classpath:jdbc.properties"/>



    <!--连接池是需要设置JDBC四大链接参数
             驱动类
            url
            账号
            密码
    -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>



    <!--c3p0连接池-->
    <bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>


</beans>

加载多个配置文件

ApplicationContext ctx = new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml");

2.创建容器的方式
方式一:类路径加载配置文件

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

方式二:文件路径加载配置文件

ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\applicationContext.xml");
/*
容器类型:
    -----| ApplicationContext    所有spring的容器的根接口
    --------------| ClasspathXmlApplicationContext 类路径方式查找配置文件容器
    --------------| FileSystemXmlApplicationContext 使用配置文件的绝对路径方式去查找
    --------------| AnnotationConfigApplicationContext 加载注解的配置类创建的容器,目前还没有办法给大家演示,等会就行

 */
public class ApplicationContextTest {

    @Test
    public void testGetDataSource() throws SQLException {
        //1. 创建spring容器
        //类路径方式查找配置文件容器
//        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //文件的绝对路径查找配置文件,创建spring容器
//        FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("G:/applicationContext.xml");
        //注解配置类
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        //2. 从容器中查找对象
        DataSource dataSource = context.getBean("dataSource", DataSource.class);
        System.out.println("connection:"+ dataSource.getConnection());
        //3. 关闭容器
        context.close();
    }
}
public class AppTest {

    @Test
    public void testGetDataSource() throws SQLException {
        //1. 创建spring容器
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2. 从容器中查找对象
        DataSource dataSource = context.getBean("dataSource", DataSource.class);
        System.out.println("connection:"+ dataSource.getConnection());
        //3. 关闭容器
        context.close();


    }


    @Test
    public void testC3p0GetDataSource() throws SQLException {
        //1. 创建spring容器
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2. 从容器中查找对象
        DataSource dataSource = context.getBean("c3p0DataSource", DataSource.class);
        System.out.println("connection:"+ dataSource.getConnection());
        //3. 关闭容器
        context.close();
    }
}

3.获取bean的方式,一般使用第二种
方式一:使用bean名称获取

BookDao bookDao = (BookDao) ctx.getBean("bookDao");

方式二:使用bean名称获取并指定类型

BookDao bookDao = ctx.getBean("bookDao", BookDao.class);

方式三:使用bean类型获取

BookDao bookDao = ctx.getBean(BookDao.class);

4.容器相关总结
BeanFactory是IoC容器的顶层接口,初始化BeanFactory对象时,加载的bean延迟加载
ApplicationContext接口是Spring容器的核心接口,初始化时bean立即加载
ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能
ApplicationContext接口常用初始化类
ClassPathXmlApplicationContext
FileSystemXmlApplicationContext

在这里插入图片描述

依赖注入相关
在这里插入图片描述

5.注解开发
使用注解定义Bean:
在这里插入图片描述
Spring提供@Component注解的三个衍生注解,实际效果一样都是创建对象,名字不同是为了可读性
@Controller:用于表现层bean定义
@Service:用于业务层bean定义
@Repository:用于数据层bean定义

在这里插入图片描述

在这里插入图片描述
同时使用这种方式注解配置类还要更换new的对象

public class AppTest {

    @Test
    public void test01() throws SQLException {
        //创建容器
        AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
        //2, 从spring的容器中查找对象
        DataSource dataSource = configApplicationContext.getBean("dataSource", DataSource.class);
        System.out.println("链接:"+ dataSource.getConnection());
    }
}
/*
@Service 的作用就是相当于bean标签一样。
    <bean id="bookDao1" class="com.itheima.service.impl.BookServiceImpl"/>
注意: 使用@Repository @Service、@Controller、@Component注解创建类的对象的时候都可以指定该对象在容器中的id。
       如果你不指定,默认id就是当前类的类名,而且首字母小写。


 */
@Service("bookService")
@Scope("singleton")  //指定作用范围: singleton(单例)与prototype(多例)
public class BookServiceImpl implements BookService {

    //根据类型从容器查找合适对象给该变量注入,而且自动注入不依赖setter方法,也不依赖构造方法
    /*
        注意: 使用 @Autowired根据类型自动注入 的时候,如果spring的容器中存在多个相同类型的对象
        那么优先使用名字与该属性名一样对象。 如果你需要指定注入某一个对象,那么需要配合@Qualifier注解
        去使用,@Qualifier注解可以指定名字去注入,但是@Qualifier一定不能单独使用,需要配合@Autowired使用
     */
    @Autowired
    @Qualifier("bookDao2")
    private BookDao bookDao;


    //创建对象后调用
    @PostConstruct //该注解的作用相当于以前 init-method=  , 创建对象后调用
    public void  init(){
        System.out.println("对象已经创建了,init方法被调用了...");
    }

    @PreDestroy  //销毁对象前调用的,  相当于以前destroy-method
    public void destroy(){
        System.out.println("对象已经被销毁了,destroy方法已经被调用了..");
    }


    @Override
    public void save() {
        bookDao.save();
        System.out.println("service:保存图书..");
    }
}

bean作用范围
在这里插入图片描述
bean生命周期
在这里插入图片描述

6.依赖注入

@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {

    //从配置你文件读取value使用@Value注解
    @Value("${jdbc.driver}")
    private String driver;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;


    /*
      如果需要创建第三方bean对象,并且放入到spring 容器中,需要创建一个方法去创建

      @bean注解的作用:
        1. 添加@Bean注解的方法会自动调用
        2. 方法的返回值对象会进入到spring的容器中,
     */
    @Bean("dataSource")
    public DataSource createDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

引入另外一个配置类:

@Configuration //表示该类是一个注解的配置类
@Import(JdbcConfig.class)  //@Import 引入另外一个配置类
public class SpringConfig {

}

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

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

相关文章

bitmap原理+性能优化实践

目录 背景 总体结构 从RoaringBitmp说起 3.1arraycontainer 1.3.2 bitmapcontainer 1.3.3 runcontainer 上源码 Roaring64NavigableMap RoaringBitmap RoaringArray 三种Container ArrayContainer BitmapContainer RunContainer 工作应用 需求 分析 能否多线…

ArcGIS基础实验操作100例--实验75气体扩散空间分析

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验75 气体扩散空间分析 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

MySQL常用基础 - 小白必看(二)

MySQL数据库基本操作 一、DDL 概念&#xff1a;是一个数据定义语言 该语言部分包括&#xff1a; 1、对数据库的常用操作 创建数据库&#xff1a; 1、create database 数据库名 (直接删除) 2、create database if not exists 数据库名 &#xff08;判断数据库是否存在&…

视频的水印怎样去掉?这些去水印的方法值得你试试看

喜欢视频剪辑的你会不会经常遇到这种情况&#xff1a;每次上网查找的视频素材&#xff0c;保存下来后总是带有一些水印&#xff0c;这些水印不仅不够美观&#xff0c;而且还会遮挡住视频的一些部分&#xff0c;实在是烦人。如果你遇到这种情况&#xff0c;会很想知道“给视频无…

86、【栈与队列】leetcode ——39. 滑动窗口最大值:单调队列+滑动窗口(C++版本)

题目描述 239. 滑动窗口最大值 一、单调队列滑动窗口方法 本题的特点是维护一个窗口&#xff0c;在窗口不断向前移动时&#xff0c;获取其中的最大值。由于窗口在向前移动过程中&#xff0c;元素存在着进入和出去的连续顺序&#xff0c;与FIFO的特点类似。 故可考虑用队列实…

【数据结构】初识数据结构,十分钟带你玩转算法复杂度

目录 &#x1f34a;前言&#x1f34a;&#xff1a; &#x1f95d;一、初识数据结构&#x1f95d;&#xff1a; 1.数据结构&#xff1a; 2.算法&#xff1a; &#x1f353;二、算法效率&#x1f353;&#xff1a; &#x1f348;三、算法复杂度&#x1f348;&#xff1a; 1.时…

4-1文件管理-文件系统基础

文章目录一.文件的基本概念二.文件的逻辑结构&#xff08;一&#xff09;无结构文件/流式文件&#xff08;二&#xff09;有结构文件1.顺序文件2.索引文件3.索引顺序文件4.直接文件/散列文件三.文件目录四.文件的物理结构/文件分配方式1.连续分配2.链接分配3.索引分配五.文件存…

数据结构与算法基础(王卓)(8)附:关于new的使用方法详解

part 1&#xff1a; C中new的用法&#xff08;不过就是&#xff09;如下&#xff08;几种用法&#xff09;&#xff1a; 1&#xff1a; new<数据类型> 分配&#xff1a; 指定类型的&#xff0c;大小为1的&#xff0c;内存空间&#xff1b; int *i new int;//注意&am…

13_3、Java的IO流之节点流的使用

一、FileReader和FileWriter的使用1、数据读入操作说明&#xff1a;①read():返回读入的第一个字符&#xff0c;当读到文档末尾&#xff0c;返回-1②异常的处理&#xff1a;为了保证流资源一定会执行关闭操作&#xff0c;要对异常进行try-catch-finally处理③对于读入操作&…

【PWA学习】1. 初识 PWA

什么是PWA PWA(Progressive Web Apps&#xff0c;渐进式 Web 应用)运用现代的 Web API 以及传统的渐进式增强策略来创建跨平台 Web 应用程序。这些应用无处不在、功能丰富&#xff0c;使其具有与原生应用相同的用户体验优势 我们需要理解的是&#xff0c;PWA 不是某一项技术&am…

MAC(m1)-VMWare Fusion CentOS8设置静态IP、SSH连接

在使用虚拟机的时候&#xff0c;默认情况下使用的DHCP协议&#xff08;根据网段自动分配ip&#xff09;分配的动态IP地址&#xff0c; 使得每次打开虚拟机后当前的IP地址都会发生变化&#xff0c;这样不方便管理。为了能够给当前虚拟机设置 一个静态IP地址&#xff0c;方便后…

Linux的开发工具——软件包管理器 yum

目录 1 查看 2 安装 3 卸载 4 常用软件 5 扩展细节 5.1 yum源 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成window…

【自学Python】Python标识符和保留字

Python标识符 Python标识符教程 Python 对各种 变量、方法、函数等命名时使用的字符序列称为标识符。 也可以说凡是自己可以起名字的地方都叫标识符&#xff0c;简单地理解&#xff0c;标识符就是一个名字&#xff0c;它的主要作用就是作为变量、函数、类、模块以及其他对象…

柱承重式钢模块建筑结构体系适用高度研究

作者&#xff1a;陈志华 冯云鹏 刘佳迪 刘洋 钟旭 模块建筑网 导语 摘要&#xff1a;模块建筑作为一种新兴的建筑体系&#xff0c;具有较高的预制化和装配化程度&#xff0c;符合建筑工业化以及绿色建筑的发展要求&#xff0c;但国内的模块建筑大多只应用于低多层&#xff0c;…

[付源码+数据集]Github星标上万,23 个机器学习项目汇总

在本文中分享了涵盖面向初学者&#xff0c;中级专家和专家的23种机器学习项目创意&#xff0c;以获取有关该增长技术的真实经验。这些机器学习项目构想将帮助你了解在职业生涯中取得成功、和当下就业所需的所有实践。 通过项目学习是你短期内能做的最好投资&#xff0c;这些项…

.NET 6结合SkiaSharp实现拼接验证码功能

从最初的滑动验证码&#xff0c;到实现旋转验证码&#xff01;不光实践了SkiaSharp的使用&#xff0c;也学到了很多东西。在网上看到一个拼接验证码功能&#xff0c;手痒了起来&#xff0c;结合前面实现的两种验证码&#xff0c;我们来学习一下如何实现拼接验证码功能&#xff…

流量路由技术解析

作者&#xff1a;十眠 流量路由&#xff0c;顾名思义就是将具有某些属性特征的流量&#xff0c;路由到指定的目标。流量路由是流量治理中重要的一环&#xff0c;本节内容将会介绍流量路由常见的场景、流量路由技术的原理以及实现。 流量路由的业务场景 我们可以基于流量路由…

aws sam 本地测试部署 lambda 和 apigateway

使用sam框架可以在部署serverless应用之前&#xff0c;在本地调试application是否符合预期 sam框架安装 serverless应用是lambda函数&#xff0c;事件源和其他资源的组合 使用sam能够基于docker容器在本地测试lambda函数 安装sam wget https://github.com/aws/aws-sam-cli…

ArcGIS基础实验操作100例--实验77按要素分区统计路网

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验77 按要素分区统计路网 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

ART-SLAM: Accurate Real-Time 6DoF LiDAR SLAM

IEEE Robotics and Automation Letters 意大利米兰理工学院 Abstract 地面车辆实时六自由度姿态估计&#xff0c;由于自动驾驶和三维建图等诸多应用&#xff0c;是机器人技术中一个相关和被研究广泛的课题。虽然有些系统已经存在&#xff0c;但它们要么不够准确&#xff0c;要…