Spring全注解之@CompontScan注解的自动扫描组件和指定扫描规则(二)

目录

自动扫描组件

之前的做法

现在的做法

 指定扫描规则

最后

@ComponentScan是一个可重复注解

 @ComponentScans注解的使用


 

自动扫描组件

之前的做法

之前我们如果在我们自定义的类上加上了@Controller、@Service、@Repository、@Component注解,然后再配置文件中加入以下配置就可以自动扫描到容器中

  <context:component-scan base-package="com.zhujie.abc"></context:component-scan>

现在的做法

之前我们既然已经使用@Configuration注解来替代了配置文件那么,那么上述配置我们同样可以使用一个注解@ComponentScan来解决。

@Configuration
@ComponentScan(basePackages = {"com.zhujie"})
public class MainConfig {

    @Bean("use")
    public User getUser(){
        return new User(1001,"张三");
    }
}

我们创建三个标记注解的类如下

9143b6509a19452a8a8df63da73db7e6.png

 3dcde217b1754de29137ad07e72a042f.png

 a56a3b7b867441d083def4e7e1b73697.png

测试有几个对象被容器创建

    @Test
    public void test2(){
        ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);

        //获取容器中被创建的对象的name即传统方式时候bean标签中的id
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for(String name : beanDefinitionNames){
            System.out.println(name);
        }
    }

 8fb7ae4913a94e07b23dc9e342ede0b8.png

 指定扫描规则

上述使用@ComponentScan注解后,容器会扫描com.zhujie包及其子包下标注有@Controller、@Service、@Repository、@Component的类到容器中。那么,如果想排除一些包下的类不注册到容器中的话我们可以使用excludeFilters属性来指定

@Configuration
@ComponentScan(basePackages = {"com.zhujie"},excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
        })
//excludeFilters 是一个数组
public class MainConfig {

    @Bean("use")
    public User getUser(){
        return new User(1001,"张三");
    }
}

41ba71d8ac3848b0a4f8818fc55c4262.png

 我们在运行之前的测试类会发现userController组件已经不存在了

f5099f5e208b46e29a01a9af90d9cf79.png

如果只是想包含某写组件的话我们可以使用 includeFilters,同时的需要将useDefaultFilters设置为false

@Configuration
@ComponentScan(basePackages = {"com.zhujie"},includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
        },useDefaultFilters = false)
//excludeFilters 是一个数组
public class MainConfig {

    @Bean("use")
    public User getUser(){
        return new User(1001,"张三");
    }
}

34e450177b7f4b9fafad358556e7f6b3.png

 运行之前的测试代码,看到标记注解而类中只有controller组件被注册到容器

afaf6e3c58a842d893c1f54290b49427.png

 

最后

@ComponentScan是一个可重复注解

dfcd0a38724a480b8182c78dbfd44435.png

 因此,我们在之前的配置类中可以写多个@ComponentScan注解。这里被扫描到容器的组件就只有controller和Service了

4ddf75ea37c04bde91b5dcd339021a97.png

 运行测试类,看控制台效果

2c375a1bc76b4c33a67b8a3f520740ad.png

 @ComponentScans注解的使用

上面我们写了多个 @ComponentScan,当然我们可以使用@ComponentScans来表示多个@ComponentScan的效果

@Configuration
@ComponentScans({
        @ComponentScan(basePackages = {"com.zhujie"},includeFilters = {
                @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
        },useDefaultFilters = false),
        @ComponentScan(basePackages = {"com.zhujie"},includeFilters = {
                @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class})
        },useDefaultFilters = false)
})
//excludeFilters 是一个数组
public class MainConfig {

    @Bean("use")
    public User getUser(){
        return new User(1001,"张三");
    }
}

270ef730f4034a8ebf1eb26f835151cc.png

 运行之前的测试类,效果是一样的

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢编程的夏先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值