一,Spring注解开发
1.1 Spring原始注解
1.2 Spring新注解
二,Spring整合Junit
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 相当于@[email protected]er,按照名称进行注入 @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的idpublic class UserDaoImpl implements UserDao { @Override public void save() { System.out.println("save running... ..."); } }
如果有依赖注入可以通过@Autowired或者@[email protected]或者@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标注Bean的范围
//@Scope("prototype") @Scope("singleton") @Resposity("useDao") public class UserDaoImpl implements UserDao { //此处省略代码 }
使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法
@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直接在测试类中进行注入。
整合步骤:
①导入spring集成Junit的坐标
②使用@Runwith注解替换原来的运行期
③使用@ContextConfifiguration指定配置文件或配置类
④使用@Autowired注入需要测试的对象
⑤创建测试方法进行测试
如下:
坐标导入导入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 { }
③使用@ContextConfifiguration指定配置文件或配置类
@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(); } }
原文地址:https://www.cnblogs.com/tashanzhishi/p/12012574.html