Spring 注解开发和测试
Posted 他山之石
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 注解开发和测试相关的知识,希望对你有一定的参考价值。
1.1 Spring原始注解
2.1 原始Junit测试Spring的问题
2.2 spring整合junit
一,Spring注解开发
1.1 Spring原始注解
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。Spring原始注解主要是替代的配置 ,从而尽量解决配置繁重的问题。
有如下原始注解:
注解 说明
@Component 使用在类上用于实例化Bean
@Controller 使用在web层类上用于实例化Bean
@Service 使用在service层类上用于实例化Bean
@Repository 使用在dao层类上用于实例化Bean
@Autowired 使用在字段上用于根据类型依赖注入
@Qualififier 结合@Autowired一起使用用于根据名称进行依赖注入
@Resource 相当于@Autowired+@Qualififier,按照名称进行注入
@Value 注入普通属性
@Scope 标注Bean的作用范围
@PostConstruct 使用在方法上标注该方法是Bean的初始化方法
@PreDestroy 使用在方法上标注该方法是Bean的销毁方法
若要使用注解,需要在application.xml上进行配置,配置组件扫描作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法,如下:
<!--注解的组件扫描,扫描该报下的所有类-->
<context:component-scan base-package="com.itheima"></context:component-scan>
测试:使用@Compont或@Repository标识UserDaoImpl需要Spring进行实例化即通过spring容器进行对象创建。
//@Component("userDao")
@Repository("userDao") // userDao相当于xml配置的 bean的id
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("save running... ...");
}
}
如果有依赖注入可以通过@Autowired或者@Autowired+@Qulififier或者@Resource进行userDao的注入:如下
//@Component("userService") @Service("userService") public class UserServiceImpl implements UserService {
/*
@Autowired
@Qualifier("userDao")
*/
@Resource(name="userDao") //这两中方式都可以进行依赖注入 private UserDao userDao;
@Override public void save() { userDao.save(); } }
注入字符串和.properties文件的数据:
@Repository("userDao") public class UserDaoImpl implements UserDao {
@Value("注入普通数据") private String str;
@Value("${jdbc.driver}") private String driver; @Override public void save() { System.out.println(str); System.out.println(driver); System.out.println("save running... ..."); }
}
//@Scope("prototype") @Scope("singleton") @Resposity("useDao") public class UserDaoImpl implements UserDao { //此处省略代码 }
@PostConstruct public void init(){ System.out.println("初始化方法...."); } @PreDestroy public void destroy(){ System.out.println("销毁方法....."); }
1.2 Spring新注解
通过上面的注解配置减少了Bean在xml的配置,通过注解进行了简化,降低了配置。但无法全部取代,如下:
加载配置文件
context:property-placeholder
组件扫描
context:component-scan
随着技术的深入,大部分引入了新注解,通过新注解全面取代XML的配置。有如下新注解:
注解 说明 @Configuration 用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解 @ComponentScan 用于指定 Spring 在初始化容器时要扫描的包。 作用和在 Spring 的 xml 配置文件中的 <context:component-scan base-package="com.itheima"/>一样 @Bean 使用在方法上,标注将该方法的返回值存储到 Spring 容器中 @PropertySource 用于加载.properties 文件中的配置 @Import 用于导入其他配置类
如下是新注解的实例:
@Configuration
@ComponentScan("com.itheima")
@Import({DataSourceConfiguration.class}) public class SpringConfiguration { }
@PropertySource("classpath:jdbc.properties") public class DataSourceConfiguration { @Value("${jdbc.driver}") private String driver;
@Value("${jdbc.url}") private String url;
@Value("${jdbc.username}") private String username;
@Value("${jdbc.password}") private String password; @Bean(name="dataSource") public DataSource getDataSource() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
}
}
测试代码:
@Test
public void testAnnoConfiguration() throws Exception {
// 采用新注解需要用这个方式进行applicationContext容器获取
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = (UserService) applicationContext.getBean("userService");
userService.save();
DataSource dataSource = (DataSource) applicationContext.getBean("dataSource");
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
二,Spring整合Junit
2.1 原始Junit测试Spring的问题
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); // 不管是配置类还是配置文件
IAccountService as = ac.getBean("accountService",IAccountService.class);
这两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常。所以又不能轻易删掉。这在测试的时候非常麻烦。Spring整合junit可以帮我们解决这个问题。
2.2 spring整合junit
让SpringJunit负责创建Spring容器,但是需要将配置文件的名称告诉它将需要进行测试Bean直接在测试类中进行注入。
整合步骤:
<!--此处需要注意的是,spring5 及以上版本要求 junit 的版本必须是 4.12 及以上-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency
@RunWith(SpringJUnit4ClassRunner.class) public class SpringJunitTest { }
@RunWith(SpringJUnit4ClassRunner.class)
//加载spring核心配置文件 //
@ContextConfiguration(value = {"classpath:applicationContext.xml"}) // 上下选一个就可以
//加载spring核心配置类
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest { }
④使用@Autowired注入需要测试的对象
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringConfiguration.class})
public class SpringJunitTest { @Autowired private UserService userService; }
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {SpringConfiguration.class}) public class SpringJunitTest { @Autowired private UserService userService; @Test public void testUserService(){ userService.save(); } }
以上是关于Spring 注解开发和测试的主要内容,如果未能解决你的问题,请参考以下文章
Java开发Spring之IOC详解第二篇(注解开发JdbcTemplatem模板Junit整合)
JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)Spring整合web开发整合Junit4测试