Spring 注解开发和测试

一,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

时间: 2024-11-05 13:03:56

Spring 注解开发和测试的相关文章

Annotation(三)——Spring注解开发

Spring框架的核心功能IoC(Inversion of Control),也就是通过Spring容器进行对象的管理,以及对象之间组合关系的映射.通常情况下我们会在xml配置文件中进行action,service,dao等层的声明,然后并告知框架我们想要的注入方式,然后在类中声明要组合类的get,set方法.而通过Spring框架中注解的运用也就主要是解决这类问题的.而框架中另一个核心知识AOP,一种面向横切面的方法编程,在程序中一般都是进行一次设置就可以的,所以都还放在配置文件中.例如声明式

spring注解开发中常用注解以及简单配置

一.spring注解开发中常用注解以及简单配置 1.为什么要用注解开发:spring的核心是Ioc容器和Aop,对于传统的Ioc编程来说我们需要在spring的配置文件中邪大量的bean来向spring容器中注入bean对象, 然而,通过注解编程可以缩短我们开发的时间,简化程序员的代码编写. 2.如何开启注解开发:最常用的方法是使用<mvc:annotation-driven/>来开启注解编程(用一个标签配置了spring注解编程的映射器和适配器,同时配置了许多的参数) 3.如何将有注解的be

spring注解开发及AOP

Spring的bean管理(注解) 注解介绍 1 代码里面特殊标记,使用注解可以完成功能 2 注解写法 @注解名称(属性名称=属性值) 3 注解使用在类上面,方法上面 和 属性上面 Spring注解开发准备 1 导入jar包 (1)导入基本的jar包 (2)导入aop的jar包 2 创建类,创建方法 3 创建spring配置文件,引入约束 (1)第一天做ioc基本功能,引入约束beans (2)做spring的ioc注解开发,引入新的约束 <beans xmlns:xsi="http://

Struts2+Spring3+MyBatis3整合以及Spring注解开发

 分类: Web(2)  版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在做一个SpringMVC+spring+MyBatis的项目,突然想起以前自己要搭建一个Struts2+Spring+IBatis的框架,但是没成功,正好看见培训时候老师给的千里之行的开源项目.于是将这个项目提供的SQL加入到了自己的数据库中(所以数据和项目名用的是qlzx),打算以后做练习的时候用这个数据库.那么接下来问题来了(不要说某翔或者不约,不是那个问题):我有了数据库和数据,想要搭建一个网站,该怎么做

Spring框架(4)--Spring注解开发

Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替核心配置文件中的依赖注入可以达到简化配置的效果,提高开发效率. 几个常用的原始注解: 创建对象的注解: 注解 说明 @Component 使用在类上,用于实例化Bean @Controller 使用在web层类上,用于实例化Bean @Service 使用在service层类上,用于实例化Bean @Repository 使用在dao层类上用于,实例化Bean 依赖注入的注解: 注解 说明 @Auto

Spring注解开发系列 VIII --- SpringMVC

SpringMVC是三层架构中的控制层部分,有过JavaWEB开发经验的同学一定很熟悉它的使用了.这边有我之前整理的SpringMVC相关的链接: 1.SpringMVC入门 2.SpringMVC进阶 3.深入SpringMVC注解 看过之后大致对springmvc有一个了解,但对于真正完全掌握springmvc还差得远,本篇博客主要针对的是springmvc的注解开发,传统的项目使用spingmvc避免不了地需要在web.xml里配置前端控制器等等,想要在项目中优雅地去掉这些配置,还得学习如

spring注解开发AnnotationConfigApplicationContext的使用

使用AnnotationConfigApplicationContext可以实现基于Java的配置类加载Spring的应用上下文.避免使用application.xml进行配置.相比XML配置,更加便捷. 示例 AppConfig.java package com.myapp.config; import com.myapp.Entitlement; import org.springframework.context.annotation.Bean; import org.springfram

spring注解开发

applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springfram

spring注解开发-扩展原理(源码)

1.BeanFactoryPostProcessor BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的; BeanFactoryPostProcessor:beanFactory的后置处理器:在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容:即所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建: BeanFactoryPostProcessor原理: 1)IOC容器创建对象 2)调