Spring | 数据源对象 properties文件 创建容器和获取bean 容器总结

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: Spring | 数据源对象 properties文件 创建容器和获取bean 容器总结

一、前言


这篇文章主要介绍


1. spring中如何在配置文件applicationContext.xml中配置外部数据源对象的bean

2. 如何加载配置文件到applicationContext.xml中使用


二、内容


1.数据源对象管理


构造DruidDataSource对象


第一步:在pom.xml中导入druid连接池的坐标


<!--        druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.0</version>
        </dependency>


第二步:在applicationContext.xml文件中构造bean对象


<!--    管理druid-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!--        setter注入-->
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<!--        注入驱动类名-->
        <property name="url" value="mysql:jdbc://localhost:3306/daily?useSSL=false"/>
<!--        注入url-->
        <property name="username" value="root"/>
<!--        注入数据库用户名和密码-->
        <property name="password" value="@123456"/>
    </bean>


第三步:获取spring构造出来的对象


public class DruidApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //加载配置文件
        DruidDataSource dataSource = (DruidDataSource) context.getBean("dataSource"); //获取druid数据源对象
        System.out.println(dataSource); //druid
    }
}


第四步:查看运行结果


{
  CreateTime:"2022-12-27 09:27:31",
  ActiveCount:0,
  PoolingCount:0,
  CreateCount:0,
  DestroyCount:0,
  CloseCount:0,
  ConnectCount:0,
  Connections:[
  ]
}


在控制台打印了如上信息,以上属性都是可以在applicationContext.xml中注入的。


构造ComboPooledDataSource对象


这个构造和druid很类似,因为同样是获取数据源对象,只是这个类中属性的名字不一样,请看代码。


<!--    管理c3p0对象-->
    <bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!--        注入驱动类名-->
        <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
        <!--        注入url-->
        <property name="jdbcUrl" value="mysql:jdbc://localhost:3306/daily?useSSL=false"/>
        <!--        数据库用户名和密码-->
        <property name="user" value="root"/>
        <property name="password" value="@123456"/>
        <property name="maxConnectionAge" value="200"/>
    </bean>


可以看到驱动类名的属性,url,用户名和druid是不同的,这是我们要注意的地方,其他步骤一致,下面请看运行结果。


com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 3


上面只截取了一部分

注意看上面这种创建数据源对象的方式,把和数据库有关的信息都放在xml文件里了,这样的代码冗余度和耦合度很高。


因此,主流的写法是把这些连接信息放在properties文件中,在applicationContext.xml中加载这个properties文件,从而获取相关信息。


2.加载properties文件


步骤


第一步:在applicationContext.xml中开启context命名空间

a82fb195e5f34c65b6437447e0ea108b.png


第二步:使用context命名空间加载properties配置文件


<!--    第二步:使用context命名空间加载properties文件-->
    <context:property-placeholder location="jdbc.properties"/>

第三步:使用${}读取配置文件里的属性值


<bean id="dataS" class="com.alibaba.druid.pool.DruidDataSource">
<!--        第三步:使用${}读取属性值-->
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${username}"/>
<!--        当系统变量名和配置文件中属性名重名时,可以关闭系统模式-->
        <property name="password" value="${jdbc.password}"/>
    </bean>


注意事项


1.加载多个配置文件使用逗号隔开


<context:property-placeholder location="jdbc.properties,jdbc2.properties"/>



2.使用$ {}获取值时如果系统变量名和属性名重名,要关闭系统属性模式

例如 $ {username}获取到的是电脑用户名,而不是配置文件里的username值


1b2b3cfe502c4afaa4af5a716cd51ed5.png


public class PropertiesApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //加载配置文件
        DruidDataSource dataSource = (DruidDataSource) context.getBean("dataS");
        System.out.println(dataSource.getPassword()); //获取数据库密码
        System.out.println(dataSource.getUsername()); //获取数据库用户名
    }
}

运行结果

e6458b54d9b646a28e8bb04e94019319.png


关闭系统属性模式:


<context:property-placeholder location="jdbc.properties,jdbc2.properties" system


3.使用通配符*加载所有配置文件


    <context:property-placeholder location="*.properties" system-properties-mode="NEVER"/>


4.规范化写法


    <context:property-placeholder location="classpath:*.properties" system-properties-mode="NEVER"/>

5.连同jar包中的配置文件一起加载


    <context:property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/>

总结:


240f52c0239f4b96b1403f558a75ceb7.png


3.容器


创建context容器的三种方式


1.通过ClassPathXmlApplicationContext创建,参数是spring的配置文件名


ApplicationContext context = new ClassPathXmlApplicationContext("app_2.xml");



2.通过FileSystemXmlApplicationContext创建,参数是配置文件在本机上的绝对路径


ApplicationContext context = new FileSystemXmlApplicationContext("F:\\Codes\\vacation\\ssm


3.加载多个配置文件,有多少个配置文件就写几个参数


ApplicationContext context1 = new ClassPathXmlApplicationContext("app_2.xml", "applicationC


获取bean的三种方式


1.id+强转


UserDao dao = (UserDao) context.getBean("userDao");

2.id+类型


UserDao userDao = context.getBean("userDao", UserDao.class);

3.类型(前提是配置文件中该类型的bean唯一,否则报错)


UserDao bean = context.getBean(UserDao.class);


报错示例


<bean class="dao.impl.UserDaoImpl" id="userDao" lazy-init="true"/>
 <bean class="dao.impl.UserDaoImpl" id="userDao1"/>

16d6e127d95f42f9a091cbdb5fa18439.png

bf487cd1623b48ba8da14919db667d99.png

如图中,存在两个UserDaoImpl的bean,通过类型获取,就产生了报错。


使用BeanFactory和ApplicationContext获取bean的对比


public class App_2 {
    public static void main(String[] args) {
        Resource resource = new ClassPathResource("app_2.xml");
        BeanFactory factory = new XmlBeanFactory(resource); //早期通过BeanFactory的方式获取bean
        UserDao bean = factory.getBean("userDao", UserDao.class);
        bean.say();
    }
}


运行结果

0dfaaf2299064857871e2701b86cee68.png

首先看构造方法

62494a5f19bf48b8a74969dded4737ca.png

注意看下面的对比

13f92cbbc9c34ff591a94b92b4bc8c82.png

BeanFactory这里只有两行代码的运行结果

7e46abd46c3e4f9bb01f4178250722d5.png

运行结果为空

655c200177ce480592e0f0bc2f626644.png

运行结果调用了构造方法

463f202972d34729ab063edce5833292.png

因此,使用BeanFactory和ApplicationContext获取容器的区别是创建bean的时机不同,

前者是延迟加载,在getBean()时才创建;后者是立即加载,在ApplicationContext对象创建好的时候就创建好了bean

当然也可以设置ApplicationContext为延迟加载。

49a882a4a0944385932cbbffcb675fc9.png

4.核心容器总结


容器相关


BeanFactory ApplicationContext
容器最底层的接口 实现自该接口
延迟加载bean 立即加载bean

bean相关


0211c63295bf4ec99c5afb94dd429320.png


依赖注入相关

9e4655e90b1444f48e21106d65e27726.png


总结:


构造器注入 setter注入
使用constructor标签 使用property标签
name写属性名 name写属性名
简单类型(但包括string)用value 引用类型用ref


三、结语


这篇文章主要介绍了如何在配置文件中创建外部数据源对象,加载和使用properties文件,创建容器和获取bean的三种方式并对之前的一些知识点做了总结,后续会补充关于集合注入和自动装配的知识。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
4月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
4月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
576 2
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
450 2
|
9月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
XML Java 数据格式
Spring容器的本质
本文主要讨论Spring容器最核心的机制,用最少的代码讲清楚Spring容器的本质。
|
自然语言处理 IDE Java
SpringBoot start.aliyun.com创建项目,解决properties乱码的问题
通过确保文件和开发环境的编码一致,配置 Maven 编码,设置 Spring Boot 应用和嵌入式服务器的编码,可以有效解决 properties 文件的乱码问题。以上步骤可以帮助开发者确保在 Spring Boot 项目中正确处理和显示多语言字符,避免因编码问题导致的乱码现象。
764 5
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
399 12
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
537 12
|
Java Spring
【Spring配置】创建yml文件和properties或yml文件没有绿叶
本文主要针对,一个项目中怎么创建yml和properties两种不同文件,进行配置,和启动类没有绿叶标识进行解决。

热门文章

最新文章