当前位置 > it书童 > java > 正文
推荐小册
java高效编程
怎样更高效地用 java 编程

juc并发工具库
java并发编程工具库

设计模式
设计模式

jvm调优
jvm调优

rabbitmq实战
rabbitmq实战

redis实战
redis实战

Keepavlied高可用集群
Keepavlied高可用集群

nginx入门到实战
nginx入门到实战

java调试
java调试中遇到的各种坑

java输入输出流
java输入输出流

spring 基于 xml 的 ioc 的 crud 案例

java it书童 2020-08-19 18:32:37 0赞 0踩 615阅读 0评论

此案例主要将前面关于 spring ioc 的知识点串联起来

要点有两个

  • bean.xml 配置文件对依赖的管理

  • spring 整合 junit

bean.xml

<!--配置Service-->
<bean id="accountService" class="com.itshutong.service.impl.AccountServiceImpl">
    <!--注入dao-->
    <property name="accountDao" ref="accountDao"></property>
</bean>
<bean id="accountDao" class="com.itshutong.dao.impl.AccountDaoImpl">
    <property name="runner" ref="runner"></property>
</bean>

<bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
    <!--    注入数据库-->
    <constructor-arg name="ds" ref="dataSource"></constructor-arg>
</bean>

<!--    配置数据库-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3307/test?useSSL=false"></property>
    <property name="user" value="root"></property>
    <property name="password" value="root"></property>
</bean>

仔细看各个 bean 之间的关系,id 属性标识了 bean 的惟一,ref 标识了关联的 bean

spring 整合 junit

测试类中的问题

每个测试方法都有以下两行代码:

ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); 
IAccountService as = ac.getBean("accountService",IAccountService.class);

这两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常。所以又不能轻易删掉。

针对上述问题,我们需要的是程序能自动帮我们创建容器。一旦程序能自动为我们创建 spring 容器,我们就 无须手动创建了,问题也就解决了。

但显然,junit 是无法实现的,因为它自己都无法知晓我们是否使用了 spring 框架,更不用说帮我们创建 spring 容器了。不过好在,junit 给我们暴露了一个注解,可以让我们替换掉它的运行器。

这时,我们需要依靠 spring 框架,因为它提供了一个运行器,可以读取配置文件(或注解)来创建容器。我们只需要告诉它配置文件在哪就行了。

pom.xml 引入依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

整合 junit

  1. 使用 @RunWith 注解替换原有运行器
@RunWith(SpringJUnit4ClassRunner.class)
  1. 使用@RunWith 注解替换原有运行器
@ContextConfiguration(locations = "classpath:bean.xml")

@ContextConfiguration 注解:

locations 属性: 用于指定配置文件的位置。如果是类路径下,需要用 classpath 表明

classes 属性: 用于指定注解的类。当不使用 xml 配置时,需要用此属性指定注解类的位置

  1. 使用@Autowired 给测试类中的变量注入数据
@Autowired
private IAccountService as;

为何不把测试类整合到 xml 中

虽然将测试类配到 xml 中可用,但不应该这么做,原因如下:

当我们在 xml 中配置了一个 bean,spring 加载配置文件创建容器时,就会创建对象。

测试类只是我们在测试功能时使用,而在项目中它并不参与程序逻辑,也不会解决需求上的问 题,所以创建完了,并没有使用。那么存在容器中就会造成资源的浪费

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/646/spring-based-on-xml-ioc-crud-case