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          相当于@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(); 
    } 
}    
 

猜你喜欢

转载自www.cnblogs.com/tashanzhishi/p/12012574.html