hualinux spring 4.5:@ComponentScan自动扫描

 目录

一、自动扫描 @ComponentScan 注解

1.1 标准方式

1.2 自定义过滤规则

二、例子

2.1 例1:普通的自动扫描组件例

2.1.1 项目目录

2.1.2 实现代码

2.1.3 运行结果

2.2 例2:添加过滤条件

2.3 例3:自定义过滤器


本章将讲  @ComponentScan (自动扫描)  注解。

@ComponentScan相当于XML的<context:component-scan>

 

一、自动扫描 @ComponentScan 注解

@ComponentScan注解和XML的<context:component-scan>功能是相同的,只不过是使用注解方式而已。

@ComponentScan有几种方式

1.1 标准方式

@ComponentScan(value = "扫描指定的包")

ps:如果和XML配置一起使用可以使用

如:

@ComponentScan(value = "com.hualinux.beans")

还可以带过滤功能,还有其它几个参数可选 

excludeFilters = Filter[ ] : 指定扫描的时候按照什么规则排除那些组件
includeFilters = Filter[] : 指定扫描的时候只需要包含哪些组件|

如:

@ComponentScan(value = "com.hualinux",excludeFilters = {@ComponentScan.Filter(
type = FilterType.ANNOTATION,classes={Controller.class, Service.class})}, useDefaultFilters = false)

也可以使用复数

@ComponentScans(
        value = {
                @ComponentScan(value = "com.hualinux.beans",includeFilters = {
                        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {
                                BookService.class
                        })
                },useDefaultFilters = false)
        }
)

 

1.2 自定义过滤规则

可以使用  @ComponentScan.Filter(type = FilterType.CUSTOM 

如:

@ComponentScan(value = "com.hualinux",excludeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,
       classes={MyTyperFilter.class})}, useDefaultFilters = false)

注:上面class必须是TyperFilter的实现类,如上面自定义的 classes={MyTyperFilter.class}

查看TyperFilter类,看到参数的使用方式一

按着Ctrl键盘不放点上面 FilterType.CUSTOM的CUSTOM,鼠标会成变手形,点一下即会进入该类

metadataReader:读取到的当前正在扫描的类的信息
metadataReaderFactory :可以获取到其他任何类信息的

 

二、例子

2.1 例1:普通的自动扫描组件例

我就简单的在前一章建立的spring-annotation项目的基础上建立了,建立简单的MVC三层,分别用到了@Repository、@Service、@Controller这3个注解,什么都不用写

2.1.1 项目目录

2.1.2 实现代码

src-->com.hualinux.beans.dao.BooDao.java

package com.hualinux.beans.dao;

import org.springframework.stereotype.Repository;

@Repository
public class BooDao {
}

com.hualinux.beans.service.BookService.java

package com.hualinux.beans.service;

import org.springframework.stereotype.Service;

@Service
public class BookService {
}

com.hualinux.beans.controller.BookController.java

package com.hualinux.beans.controller;

import org.springframework.stereotype.Controller;

@Controller
public class BookController {
}

conf.MainConfAutoScan.java

package conf;


import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@ComponentScan(value = "com.hualinux.beans")
@Configuration
public class MainConfAutoScan {

}

PS:上面加了注解之外,没有写任何东西

com.hualinux.beans.AutoScanMain.java

package com.hualinux.beans;

import conf.MainConfAutoScan;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AutoScanMain {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(MainConfAutoScan.class);
        String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
        for (String name: beanDefinitionNames){
            System.out.println(name);
        }

    }
}

 

2.1.3 运行结果

运行上面AutoScanMain.java,发现找到了4个组件,连配置类都算进去了

mainConfAutoScan
bookController
booDao
bookService

 

2.2 例2:添加过滤条件

例1中默认是搜索所以组件的,在这里我能不能过滤不扫描,控制和服务组件呢,可以的,在配置文件修改一下

conf.MainConfAutoScan.java

package conf;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;


@ComponentScan(value = "com.hualinux",excludeFilters = {@ComponentScan.Filter(
        type = FilterType.ANNOTATION,classes={Controller.class, Service.class})})
/*@ComponentScan(value = "com.hualinux.beans")*/
@Configuration
public class MainConfAutoScan {

}

再次运行一下,发现 Controller组件 和 Service组件 都不能使用了

 

2.3 例3:自定义过滤器

我在例1的基础上,定义一个过滤器,然后应用它

src-->com.hualinux.beans.MyTyperFilter.java

package com.hualinux.beans;

import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;

import java.io.IOException;

public class MyTyperFilter implements TypeFilter {
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        AnnotationMetadata annotationMetadata=metadataReader.getAnnotationMetadata();
        ClassMetadata classMetadata=metadataReader.getClassMetadata();
        String className = classMetadata.getClassName();
        System.out.println("--->"+className);
        Resource resource = metadataReader.getResource();

        return false;
    }
}

修改一下conf.MainConfAutoScan.java

@ComponentScan(value = "com.hualinux",excludeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,
        classes={MyTyperFilter.class})}, useDefaultFilters = false)
@Configuration
public class MainConfAutoScan {

}

use-default-filters="false"

不使用默认的filters,默认filters为全部的注解包括了@Repository、@Service、@Controller、@Component等

运行之前的com.hualinux.beans.AutoScanMain,结果如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值