• 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:使用自定义规则
        */
  • 相关阅读:
    Android 对话框(Dialog)
    struts2 开发模式
    Struts2动态方法调用(DMI)
    Struts2中 Path (getContextPath与basePath)
    String path = request.getContextPath
    ios虚拟机安装(二)
    Spring MVC 的 研发之路
    Swift辛格尔顿设计模式(SINGLETON)
    【算法导论】多项式求和
    uva 11181
  • 原文地址:https://www.cnblogs.com/lyh233/p/12435045.html
Copyright © 2020-2023  润新知