1.ソースの決意
我々はそれがスキャナの構成要素であることを知ることができる翻訳から@ComponentScanは、私たちが指定した範囲をスキャンすることができ、このスキャナは、対応するフィルタシステムは、当社の設定のために指定されている、あなたも私たちのカスタムフィルタを使用することができます。
[1]ここでは、いくつかの主要な方法の話でソースコードで始まります
public @interface ComponentScan {
//这个value值就是指定我们扫描包的路径
//@AliasFor这里指的是使用时可以使用的另一个别名
@AliasFor("basePackages")
String[] value() default {};
//指定包含类型的过滤器,在这里面可以指定Filter来设定我们过滤时通过什么辨别(最常用的是注解和类)
Filter[] includeFilters() default {};
//指定需要排除类型的过滤器
Filter[] excludeFilters() default {};
@Target({})
@interface Filter {
//Filter的类型(默认是注解)
FilterType type() default FilterType.ANNOTATION;
@AliasFor("classes")
Class<?>[] value() default {};
@AliasFor("value")
Class<?>[] classes() default {};
String[] pattern() default {};
[2]のfilterTypeこのクラスのショー私たちが値を入力できること
package org.springframework.context.annotation;
public enum FilterType {
/**
* Filter candidates marked with a given annotation.
* @see org.springframework.core.type.filter.AnnotationTypeFilter
* 指定的注解(使用较多)
*/
ANNOTATION,
/**
* Filter candidates assignable to a given type.
* @see org.springframework.core.type.filter.AssignableTypeFilter
* 指定的类型,即我们指定扫描哪个类(使用较多)
*/
ASSIGNABLE_TYPE,
/**
* Filter candidates matching a given AspectJ type pattern expression.
* @see org.springframework.core.type.filter.AspectJTypeFilter
*/
ASPECTJ,
/**
* Filter candidates matching a given regex pattern.
* @see org.springframework.core.type.filter.RegexPatternTypeFilter
* 正则表达式
*/
REGEX,
/** Filter candidates using a given custom
* {@link org.springframework.core.type.filter.TypeFilter} implementation.
* 自定义类型(使用较多)
*/
CUSTOM
}
[3]は、あなたが話している、無知な力を見て?私たちは、一例でそれを示してincludeFilters
@Configuration
//@Controller @Service @Respostry @Component
@ComponentScan(value="com.enjoy.cap2",
includeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})}
,useDefaultFilters=false)
public class Cap2MainConfig {
分析:パッケージの値をスキャンする必要性を示すクラス、でこの注釈(com.enjoy.cap2これは、これらのノートは、カテゴリを示さ@Controller @Service @Respostry @Componentを持っている私の新しいパッケージです) ;次にincludeFiltersはFilterType.ANNOTATION、注釈クラス(コントローラベース)に対応するクラスを表すために、後者の使用によって、このような(走査すなわち、我々の対応するアノテーション含む)などの対応するコンポーネントルールを指定し、我々は最終的に走査します唯一の標準@Controllerクラス、およびクラスの残りの部分は除外されました。
useDefaultFilters =偽、これはああ、私たちは再びソースコードにそれを取るものです
/**
* Indicates whether automatic detection of classes annotated with {@code @Component}
* {@code @Repository}, {@code @Service}, or {@code @Controller} should be enabled.
* 指示是否自动检测用{@code@Component}注释的类应该启用{@code@Repository}、{@code@Service}或{@code@Controller}。
**/
boolean useDefaultFilters() default true;
デフォルトでは、それはつまり、開いている、我々はフィルタルールの適切なセットを設定していない、それはこれらのパッケージ注釈付きのクラスをスキャンしていきます。これは、私たちが今だけ@Controller対応するクラスをスキャンすることを必要とするので、我々は、falseに設定した理由です。(これが本当であるならば、私たちは、フィルタリングルールが失敗します設定しました)
次に、我々はそれ以上の違いを説明するためにexcludeFiltersを使用します
@Configuration
//@Controller @Service @Respostry @Component
@ComponentScan(value="com.enjoy.cap2",
excludeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})}
,useDefaultFilters=false)
public class Cap2MainConfig {
一部の人々はincludeFiltersがexcludeFiltersが適切な除外にあなたを達成することができるように変更され、これは何も言うことがないではないことを、当たり前になります。はい、している権利が、我々がそのスキャンを閉じたので、我々は単に対応するコメントに行いませんのでuseDefaultFiltersは= falseのはこれが可能ではない、そしてどのように我々は、すべて同じなしの効果を除外しないことに留意すべきですuseDefaultFilters上で適切なスキャン、我々はスキャン有効にする必要がありますが、= trueが通常の使用に変更することができます。
[4]私たちはすでに、関連する属性includeFilterとexcludeFilterを知っている上に、我々は我々が使用することができ@Fiterこれら二つの属性の相関値にさらに見ていきますから。
@Filter 2. Filterクラスの定義
二つの最も一般的に使用される当社CUSTOM(カスタム型)を超えている、あなたができるに加えて、我々はすでにそこのfilterTypeの型注釈(デフォルト)、ASSIGNABLE_TYPEは(我々はそのようなxxxController.classとして指定されたクラスを、スキャンする必要がある)ということを学びました当社独自のルールを設定するには、このタイプのフィルタ
のfilterTypeこのクラス3つの最も一般的に使用される値
package org.springframework.context.annotation;
public enum FilterType {
ANNOTATION,
ASSIGNABLE_TYPE,
CUSTOM
}
[1](あなたは私たち自身のフィルタリングルールを書くことができます)、カスタムフィルタクラスの書き込み
継承のtypeFilterにMyTypeFilterこのクラスのニーズを
package com.enjoy.cap2.config;
import java.io.IOException;
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;
public class JamesTypeFilter implements TypeFilter {
/**
* MetadataReader: 读取当前正在扫描类的信息
* MetadataReaderFactory: 可以获取到其他类的信息
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
throws IOException {
/**这里只是说明它拥有方法**/
//获取当前类注解的信息
//AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//获取当前的资源(类的路径)
//Resource resource = metadataReader.getResource();
//获取正在扫描的类信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
String className = classMetadata.getClassName();
System.out.println("----->"+className);
/**
获取我们扫描的包中的类名,如果我们只需要得到相应的订单类Order,这时候我们就
可以设置它的匹配规则如下
**/
if(className.contains("Order")) {
//当类包含Order字符,则匹配成功,返回true
return true;
}
return false;
}
}
メイン設定クラスにおける我々のカスタムフィルタリングルールへの[2]
のfilterTypeは、我々のカスタム型である本明細書FilterType.CUSTOMを使用します。クラスは、私たちのクラス名です。この紹介の後、私たちは、あなたが定義したルールに従って、適切なフィルタを作ることができます(このような順序など、ここだけで、関連する私たちのクラスは、対応するスキャンにルールにマッチする時期)
@Configuration
//@Controller @Service @Respostry @Component
@ComponentScan(value="com.enjoy.cap2",includeFilters= {
@Filter(type= FilterType.CUSTOM,classes= {MyTypeFilter.class})
}
,useDefaultFilters=false)
public class Cap2MainConfig {
概要
@ComponentScan(値=「com.enjoy.cap2」、includeFilters = {
@Filter(タイプ= FilterType.CUSTOM、クラス= {MyTypeFilter.class})
}
、useDefaultFilters =偽)
このカバーは、限り我々は走査によって指定されたパケット@ComponentScan値に対応するパスを知っているように、貫通記載上方
条件includeFiltersのexcludeFiltersがそれを含むまたは除外テーブルまたはコマンドを満たすために、及び条件は、ことによりますその上注釈、クラス、カスタムクラスとを指定する@Filte上のfilterType。