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

举报
向阳花花花花 发表于 2023/07/25 11:10:02 2023/07/25
【摘要】 这篇文章主要介绍:1. spring中如何在配置文件applicationContext.xml中配置外部数据源对象的bean。2. 如何加载配置文件到applicationContext.xml中使用。

一、前言

这篇文章主要介绍

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 -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false]

上面只截取了一部分
注意看上面这种创建数据源对象的方式,把和数据库有关的信息都放在xml文件里了,这样的代码冗余度和耦合度很高。
因此,主流的写法是把这些连接信息放在properties文件中,在applicationContext.xml中加载这个properties文件,从而获取相关信息。

2.加载properties文件

步骤

第一步:在applicationContext.xml中开启context命名空间
在这里插入图片描述
第二步:使用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值
在这里插入图片描述

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()); //获取数据库用户名
    }
}

运行结果
在这里插入图片描述
关闭系统属性模式:

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

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"/>

总结:
总结

3.容器

创建context容器的三种方式

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

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

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

ApplicationContext context = new FileSystemXmlApplicationContext("F:\\Codes\\vacation\\ssm\\code\\src\\main\\resources\\app_2.xml");

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

ApplicationContext context1 = new ClassPathXmlApplicationContext("app_2.xml", "applicationContext.xml");

获取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"/>

在这里插入图片描述
多个相同类型的bean报错
如图中,存在两个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();
    }
}

运行结果
在这里插入图片描述
首先看构造方法
在这里插入图片描述
注意看下面的对比
在这里插入图片描述
BeanFactory这里只有两行代码的运行结果
在这里插入图片描述
运行结果为空
在这里插入图片描述
运行结果调用了构造方法
在这里插入图片描述
因此,使用BeanFactory和ApplicationContext获取容器的区别是创建bean的时机不同,
前者是延迟加载,在getBean()时才创建;后者是立即加载,在ApplicationContext对象创建好的时候就创建好了bean
当然也可以设置ApplicationContext为延迟加载。
在这里插入图片描述

4.核心容器总结

容器相关

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

bean相关

bean相关属性

依赖注入相关

依赖注入相关
总结:

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

三、结语

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

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。