【Spring】数据源对象、properties文件、创建容器和获取bean容器总结
这篇文章主要介绍
1. spring中如何在配置文件applicationContext.xml中配置外部数据源对象的bean
2. 如何加载配置文件到applicationContext.xml中使用
第一步:在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中注入的。
这个构造和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文件,从而获取相关信息。
第一步:在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"/>
总结:
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");
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,通过类型获取,就产生了报错。
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为延迟加载。
BeanFactory | ApplicationContext |
---|---|
容器最底层的接口 | 实现自该接口 |
延迟加载bean | 立即加载bean |
总结:
构造器注入 | setter注入 |
---|---|
使用constructor标签 | 使用property标签 |
name写属性名 | name写属性名 |
简单类型(但包括string)用value | 引用类型用ref |
这篇文章主要介绍了如何在配置文件中创建外部数据源对象,加载和使用properties文件,创建容器和获取bean的三种方式并对之前的一些知识点做了总结,后续会补充关于集合注入和自动装配的知识。
- 点赞
- 收藏
- 关注作者
评论(0)