一文让你理解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();} }