Spring注解IoC与JUnit整合实战

目录

项目概述

[Spring IoC注解方式详解](#Spring IoC注解方式详解)

核心注解分析

配置类注解

组件注解

依赖注入方式

字段注入

构造器注入

setter方法注入

@Resource注入

多实现类问题解决

Spring与JUnit整合测试

测试类分析

传统测试方式对比

配置方式对比

XML配置(applicationContext.xml)

Java配置(SpringConfig.java)

项目结构与依赖


项目概述

本项目展示了Spring 框架中基于注解的IoC (控制反转)实现方式,以及如何将SpringJUnit单元测试框架整合使用。项目包含以下核心内容:

  1. 基于注解的Bean定义与依赖注入
  2. Java 配置类替代XML配置
  3. 多实现类的依赖解决策略
  4. SpringJUnit的整合测试

Spring IoC注解方式详解

核心注解分析

配置类注解

SpringConfig.java中:

java 复制代码
@Configuration
@ComponentScan("com.qcby")
@Import()
public class SpringConfig {
    @Bean
    public DataSource getDruidDataSource() throws SQLException {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriver(new Driver());
        dataSource.setUrl("jdbc:mysql://localhost:3306/hotel?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        return dataSource;
    }
}
  • **@Configuration:**标识这是一个Spring配置类
  • @ComponentScan: 自动扫描指定包及其子包下的组件(@Component,@Service,@Controller等)
  • **@Bean:**将方法返回的对象注册为Spring容器中的Bean,方法名默认作为Bean的ID

组件注解

在业务实现类中:

java 复制代码
@Service
public class UserServiceImpl implements UserService {
    // ...
}

@Service
public class UserServiceImpl01 implements UserService {
    // ...
}

@Controller
public class UserController {
    // ...
}
  • **@Service:**标识业务层组件
  • **@Controller:**标识控制层组件
  • 这些注解都是**@Component**的特化形式,功能相同但是语义更明确

依赖注入方式

项目展示了多种依赖注入方式:

字段注入

java 复制代码
@Autowired
@Qualifier("getDruidDataSource")
private DataSource dataSource;
  • **@Autowired:**自动按类型装配
  • **@Qualifier:**当有多个同类型Bean时,指定具体的Bean名称

构造器注入

java 复制代码
@Autowired
public UserController(UserService userService) {
    this.userService = userService;
}

setter方法注入

java 复制代码
@Value("123")
public void setMessage(String message) {
    this.message = message;
}

@Resource注入

java 复制代码
@Resource(name = "userServiceImpl")
private UserService userService;

多实现类问题解决

项目中存在两个UserService实现类:

java 复制代码
@Service // 默认bean名称为userServiceImpl
public class UserServiceImpl implements UserService

@Service // 默认bean名称为userServiceImpl01
public class UserServiceImpl01 implements UserService

在依赖注入时可以通过以下方式制定具体实现:

java 复制代码
// 方式1:@Qualifier指定bean名称
@Autowired
@Qualifier("userServiceImpl01")

// 方式2:@Resource直接指定name
@Resource(name = "userServiceImpl")

Spring与JUnit整合测试

测试类分析

Demo1.java展示了两种测试方式:

java 复制代码
@RunWith(value= SpringJUnit4ClassRunner.class)
//@ContextConfiguration(value= "classpath:applicationContext.xml")
@ContextConfiguration(classes = SpringConfig.class)
public class Demo1 {
    @Autowired
    private UserController userController;
    
    @Test
    public void run1() throws SQLException {
        userController.Hello();
    }
}
  • **@RunWith(value= SpringJUnit4ClassRunner.class):**使用Spring的测试运行器
  • @ContextConfiguration: 指定Spring配置,可以是XML或Java配置类
    • **classes属性:**制定配置类
    • **value属性:**指定XML配置文件路径
  • **@Autowired:**在测试类中直接注入需要的Bean

传统测试方式对比

在项目中注释掉的代码展示了传统测试方式:

java 复制代码
// XML配置方式
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserController userController = (UserController) context.getBean("userController");

// Java配置类方式
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserController userController = (UserController) context.getBean("userController");

与整合测试相比,传统方式需要手动创建应用上下文和获取Bean,代码更冗长。

配置方式对比

项目同时展示了XML和Java两种配置方式

XML配置(applicationContext.xml)

XML 复制代码
<context:component-scan base-package="com.qcby"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/hbu?useUnicode=true&amp;characterEncoding=UTF-8"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</bean>

Java配置(SpringConfig.java)

java 复制代码
@Bean
public DataSource getDruidDataSource() throws SQLException {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setDriver(new Driver());
    dataSource.setUrl("jdbc:mysql://localhost:3306/hotel?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC");
    dataSource.setUsername("root");
    dataSource.setPassword("root");
    return dataSource;
}

Java配置方式更加类型安全,便于重构,且可以充分利用IDE的代码提示功能。

项目结构与依赖

pom.xml中定义了项目依赖:

XML 复制代码
<dependencies>
    <!-- Spring核心 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    
    <!-- 测试相关 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>5.0.2.RELEASE</version>
        <scope>test</scope>
    </dependency>
    
    <!-- 数据库相关 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.10</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
</dependencies>

关键依赖说明:

  • **spring-context:**Spring核心容器
  • **spring-test:**Spring测试支持
  • **druid:**阿里巴巴数据库连接池
  • **mysql-conncet-java:**MySQL驱动
相关推荐
皮皮林5519 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
卡尔特斯13 小时前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin
白鲸开源13 小时前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole13 小时前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫14 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide14 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户37215742613514 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源14 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
Java中文社群15 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心15 小时前
从零开始学Flink:数据源
java·大数据·后端·flink