> 文档中心 > 一文让你理解Spring注解开发(原始注解+新注解)与Spring整合Junit

一文让你理解Spring注解开发(原始注解+新注解)与Spring整合Junit

一文让你理解Spring注解开发(原始注解+新注解)与Spring整合Junit

    • Spring注解开发
      • Spring原始注解
      • Spring新注解
    • Spring集成Junit
      • 原始Junit测试Spring的问题
      • 问题解决思路
      • Spring集成Junit步骤
      • Spring集成Junit代码实现

不要见一个爱一个,爱的太多,你的爱就要贬值。
–共勉

Spring注解开发

Spring原始注解

Spring原始注解主要是替代的配置:
在这里插入图片描述

为了有助于更好的理解,下面做一些例子:

注意
使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法

<!--注解的组件扫描--> <context:component-scan base-package="com.itheima"></context:componentscan>

使用@Compont或@Repository标识UserDaoImpl需要Spring进行实例化。

//@Component("userDao")@Repository("userDao")public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("save running... ...");} }

1.使用@Compont或@Service标识UserServiceImpl需要Spring进行实例化
2.使用@Autowired或者@Autowired+@Qulifier或者@Resource进行userDao的注入

//@Component("userService")@Service("userService")public class UserServiceImpl implements UserService {/*@Autowired@Qualifier("userDao")*/@Resource(name="userDao")private UserDao userDao;@Overridepublic void save() {userDao.save();} }

使用@Value进行字符串的注入

@Repository("userDao")public class UserDaoImpl implements UserDao {@Value("注入普通数据")private String str;@Value("${jdbc.driver}")private String driver;@Overridepublic void save() {System.out.println(str);System.out.println(driver);System.out.println("save running... ...");} }

使用@Scope标注Bean的范围

//@Scope("prototype")@Scope("singleton")public class UserDaoImpl implements UserDao {//此处省略代码}

使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法
(这两个理解就好)

@PostConstructpublic void init(){System.out.println("初始化方法....");}@PreDestroypublic void destroy(){System.out.println("销毁方法.....");}

Spring新注解

使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:

非自定义的Bean的配置:<bean>加载properties文件的配置:<context:property-placeholder>组件扫描的配置:<context:component-scan>引入其他文件:<import>

在这里插入图片描述

例子如下:
@Configuration
@ComponentScan
@Import

@Configuration@ComponentScan("com.itheima")@Import({DataSourceConfiguration.class})public class SpringConfiguration { }

@PropertySource
@value

@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

@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; }

测试加载核心配置类创建Spring容器

@Testpublic void testAnnoConfiguration() throws Exception {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

原始Junit测试Spring的问题

在测试类中,每个测试方法都有以下两行代码:

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

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

问题解决思路

  • 让SpringJunit负责创建Spring容器,但是需要将配置文件的名称告诉它
  • 将需要进行测试Bean直接在测试类中进行注入

Spring集成Junit步骤

① 导入spring集成Junit的坐标
② 使用@Runwith注解替换原来的运行期
③ 使用@ContextConfiguration指定配置文件或配置类
④ 使用@Autowired注入需要测试的对象
⑤ 创建测试方法进行测试

Spring集成Junit代码实现

① 导入spring集成Junit的坐标

<!--此处需要注意的是,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注解替换原来的运行期

@RunWith(SpringJUnit4ClassRunner.class)public class SpringJunitTest {}

③ 使用@ContextConfiguration指定配置文件或配置类

@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 {@Autowiredprivate UserService userService; }

⑤ 创建测试方法进行测试

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = {SpringConfiguration.class})public class SpringJunitTest {@Autowiredprivate UserService userService;@Testpublic void testUserService(){userService.save();} }