(知识目录)
一、前言
这篇文章主要介绍
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命名空间加载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"/>
 
 如图中,存在两个UserDaoImpl的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这里只有两行代码的运行结果
 运行结果为空
运行结果为空
 运行结果调用了构造方法
运行结果调用了构造方法
 因此,使用BeanFactory和ApplicationContext获取容器的区别是创建bean的时机不同,
前者是延迟加载,在getBean()时才创建;后者是立即加载,在ApplicationContext对象创建好的时候就创建好了bean
当然也可以设置ApplicationContext为延迟加载。
因此,使用BeanFactory和ApplicationContext获取容器的区别是创建bean的时机不同,
前者是延迟加载,在getBean()时才创建;后者是立即加载,在ApplicationContext对象创建好的时候就创建好了bean
当然也可以设置ApplicationContext为延迟加载。

4.核心容器总结
容器相关
| BeanFactory | ApplicationContext | 
|---|---|
| 容器最底层的接口 | 实现自该接口 | 
| 延迟加载bean | 立即加载bean | 
bean相关

依赖注入相关
 总结:
总结:
| 构造器注入 | setter注入 | 
|---|---|
| 使用constructor标签 | 使用property标签 | 
| name写属性名 | name写属性名 | 
| 简单类型(但包括string)用value | 引用类型用ref | 
三、结语
这篇文章主要介绍了如何在配置文件中创建外部数据源对象,加载和使用properties文件,创建容器和获取bean的三种方式并对之前的一些知识点做了总结,后续会补充关于集合注入和自动装配的知识。










