天天看点

componentscan注解的用法和作用_Spring新注解及Spring整合junit

@Configuration

  • 作用:指定当前类是一个配置类,等同于bean.xml
  • 细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写,这时系统将直接扫描该配置类。
//1.获取容器ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);
           
//AnnotationConfigApplicationContext     被springConfiguration注解过的类        /**         *     public AnnotationConfigApplicationContext(Class>... annotatedClasses) {         *         this();         *         this.register(annotatedClasses);         *         this.refresh();         *     }         */
           

@ComponentScan

  • 作用:用于通过注解指定spring在创建容器时要扫描的包
  • 属性:value,basePackages(两个属性别名互相引用,所以作用相同)指定要扫描的包

使用注解@ComponentScan(basePackages = {"com.itheima"})作用就等同于在xml中配置了

@Bean

  • 作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
  • 属性:name:用于指定bean的id,当不写时,默认值是当前方法的名称
  • 细节:当使用注解配置方法时,如果方法有参数,spring会去容器中查找有没有可用的bean对象。查找的方式和Autowired相同,根据类型匹配,有一个注入成功,没有注入失败,有多个会找bean的id和该参数名相同的进行匹配,如果有多个,可以在参数前使用@Qualifier("")注解指定容器中的bean(单独使用的情况)。

@Import

  • 作用:导入其他的配置类。
  • 属性:value:指定其他配置类的字节码。 

  使用方法:@Import(xxxx.class) //xxxx为导入的配置类名

  使用了Import注解后,有Import注解的为父配置类,而导入的都是子配置类。

@PropertySource  

  • 作用:用于指定properties文件的位置
  • 属性:value:指定文件的名称和路径
  • 关键字:classpath:表示类路径下

简单例子

componentscan注解的用法和作用_Spring新注解及Spring整合junit

父配置类

//@Configuration//@ComponentScan(basePackages = "com.itheima")//@ComponentScan(basePackages = {"com.itheima"})//数组类型String[]//@ComponentScan({"com.itheima","config"})@ComponentScan("com.itheima")@Import(JdbcConfig.class)//classpath:表示后面的路径是一个类路径,指引jdbcConfig.properties加载//@PropertySource("classpath:com/itheima/jdbcConfig.properties")// 有包可以写classpath:com/itheima/jdbcConfig.properties 没包直接文件名写即可@PropertySource("classpath:jdbcConfig.properties")public class SpringConfiguration {}
           

子配置类

/** * 和spring连接数据库相关的配置类 *///@Configurationpublic class JdbcConfig {    //spring的el表达式${}    @Value("${jdbc.driver}") //jdbc.driver表示.properties中的key,等着spring给我们获取出value    private String driver;    @Value("${jdbc.url}")    private String url;    @Value("${jdbc.username}")    private String username;    @Value("${jdbc.password}")    private String password;    /**     * 用于创建一个QueryRunner对象     * @param dataSource     * @return     */    @Bean(name = "runner")    @Scope("prototype") //细节  :要改为多例对象。默认是单例    public QueryRunner createQueryRunner(DataSource dataSource){        return new QueryRunner(dataSource);    }    /**     * 创建数据源对象     * @return     */    @Bean(name = "dataSource")    public DataSource createDataSource(){        try {            ComboPooledDataSource ds = new ComboPooledDataSource();            ds.setDriverClass(driver);            ds.setJdbcUrl(url);            ds.setUser(username);            ds.setPassword(password);            return ds;        }catch (Exception e){            throw new RuntimeException(e);        }    }}
           

jdbcConfig.properties

jdbc.driver=com.mysql.cj.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/eesy_spring?serverTimezone=UTCjdbc.username=rootjdbc.password=123456
           

测试类

public class AccountServiceTest {    @Autowired    private IAccountService as = null; @Test    public void testFindOne() {      //1.获取容器        ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);        //2.得到业务层对象        IAccountService as = ac.getBean("accountService",IAccountService.class);        //3.执行方法        Account account = as.findAccountById(1);        System.out.println(account);    } }
           

运行结果

componentscan注解的用法和作用_Spring新注解及Spring整合junit

Spring整合junit配置

使用Junit单元测试:测试我们的配置

使用步骤

1、导入spring整合junit的坐标    spring-test坐标
           
2、使用junit提供的一个注解把原有的main方法替换了,替换成spring提供的
           
@RunWith
           
@RunWith(SpringJUnit4ClassRunner.class)
           
3、告知spring的运行器,spring的ioc创建是基于xml还是注解的,并且说明位置
           
@ContextConfiguration
           
Locations:指定xml文件的位置,加上classpath关键字,表示在类路径下classes:指定注解类所在的位置
           
当我们使用spring 5.x版本的时候,要求junit的jar必须是4.12及以上
           

测试类

运行结果

componentscan注解的用法和作用_Spring新注解及Spring整合junit

继续阅读