目录
[Spring IoC注解方式详解](#Spring IoC注解方式详解)
项目概述
本项目展示了Spring 框架中基于注解的IoC (控制反转)实现方式,以及如何将Spring 与JUnit单元测试框架整合使用。项目包含以下核心内容:
- 基于注解的Bean定义与依赖注入
- Java 配置类替代XML配置
- 多实现类的依赖解决策略
- Spring 与JUnit的整合测试
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&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驱动