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