天天看點

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,滑鼠會成變手形,點一下即會進入該類

hualinux spring 4.5:@ComponentScan自動掃描
hualinux spring 4.5:@ComponentScan自動掃描
hualinux spring 4.5:@ComponentScan自動掃描

metadataReader:讀取到的目前正在掃描的類的資訊

metadataReaderFactory :可以擷取到其他任何類資訊的

二、例子

2.1 例1:普通的自動掃描元件例

我就簡單的在前一章建立的spring-annotation項目的基礎上建立了,建立簡單的MVC三層,分别用到了@Repository、@Service、@Controller這3個注解,什麼都不用寫

2.1.1 項目目錄

hualinux spring 4.5:@ComponentScan自動掃描

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

hualinux spring 4.5:@ComponentScan自動掃描

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元件 都不能使用了

hualinux spring 4.5:@ComponentScan自動掃描

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,結果如下:

下一篇: 左移測試

繼續閱讀