zoukankan      html  css  js  c++  java
  • Spring 注解开发和测试

     

    一,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标注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(); 
        } 
    }    
     
  • 相关阅读:
    CentOS系统下NFS服务器
    网络封包分析
    Android端抓包方法
    SQL Server 2008从基础开始学习的历程(1)------创建表与查询
    序--CentOS6.5 mini 安装和基本配置
    MonkeyRunner(猴哥快跑)常用类方法总结
    python 开源数据抓取框架scrapy
    pycharm最新版注册
    python flask下传数据到js
    centos打架django + mysql环境
  • 原文地址:https://www.cnblogs.com/tashanzhishi/p/12012574.html
Copyright © 2011-2022 走看看