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:使用自定义规则
    */

猜你喜欢

转载自www.cnblogs.com/lyh233/p/12435045.html