zoukankan      html  css  js  c++  java
  • 2、spring注解学习(组件注册)——@ComponentScan自动扫描组件、指定扫描规则

    1、分别创建一个Person类以及controller、service、dao左测试

     controller、service、dao分别加上注解

     2、在主配置类中使用@ComponentScan指定扫描规则

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.ComponentScan.Filter;
    import org.springframework.stereotype.Controller;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.FilterType;
    
    import com.atguigu.bean.Person;
    
    //配置类==配置文件
    @Configuration        //告诉Spring这是一个配置类
    @ComponentScan(value="com.atguigu",        //指定要扫描的包
            excludeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})} //指定以某种规则排除扫描哪些组件
    )        
    
    public class MainConfig {
        
        //给容器注册一个Bean;类型为返回值类型(bean的id默认是用方法名作为id)
        //@Bean("")增加内容后指定bean的id
        @Bean("person")
        public Person person() {
            return new Person("张三", 19);
        }
    }

     3、创建测试类进行测试

      

     在pom.xml中添加junit依赖

            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>

    测试类中写测试方法

    public class IOCTest {
        
        @Test
        public void test01() {
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
            //getBeanDefinitionNames获取容器中组件的name(即配置文件中组件的id)
            String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
            for (String name : beanDefinitionNames) {
                System.out.println(name);
            }
        }
    }

    获取组件名字打印得到:(因为在主配置类中排除了对@Controller注解的扫描,所以没有BookController组件

    4、再次修改主配置文件进行测试

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.ComponentScan.Filter;
    import org.springframework.stereotype.Controller;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.FilterType;
    
    import com.atguigu.bean.Person;
    
    //配置类==配置文件
    @Configuration        //告诉Spring这是一个配置类
    @ComponentScan(value="com.atguigu",        //指定要扫描的包
            //excludeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})} //指定以某种规则排除扫描哪些组件
            includeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})},    //指定以某种规则只扫描哪些组件
            useDefaultFilters = false    //includeFilters必须配合useDefaultFilters = false(默认值是true)来使用
    )        
    public class MainConfig {
        
        //给容器注册一个Bean;类型为返回值类型(bean的id默认是用方法名作为id)
        //@Bean("")增加内容后指定bean的id
        @Bean("person")
        public Person person() {
            return new Person("张三", 19);
        }
    }

    测试类中再次测试得到的结果为:

    此例只是以注解扫描规则举例,还有其他扫描规则可百度查询:

    /*扫描规则
        1、FilterType.ANNOTATION:按照注解
        2、FilterType.ASSIGNABLE_TYPE:按照给定类的类型,则该类的子类都会扫描注册
        3、FilterType.ASPECTJ:使用ASPECTJ表达式
        4、FilterType.REGEX:使用正则表达式
        5、FilterType.CUSTOM:使用自定义规则
        */
  • 相关阅读:
    hihocoder [Offer收割]编程练习赛14 投掷硬币
    hihocoder [Offer收割]编程练习赛14 小Hi和小Ho的礼物
    CodeForces
    [HNOI2004] 打砖块
    CodeForces
    hdu4028 The time of a day[map优化dp]
    hdu5009 Paint Pearls[指针优化dp]
    hdu4719 Oh My Holy FFF[线段树优化dp]
    hdu1024 Max Sum Plus Plus[降维优化好题(貌似以后可以不用单调队列了)]
    hdu3709 Balanced Number[数位dp]
  • 原文地址:https://www.cnblogs.com/lyh233/p/12435045.html
Copyright © 2011-2022 走看看