Spring框架注解开发快速理解(IDEA)——关于ComponentScan和Filter过滤器详细资料(新手必进)

1废话不多说,先新建一个Maven项目(不需要导入包进去在添加依赖就好)Spring框架注解开发快速理解(IDEA)——关于ComponentScan和Filter过滤器详细资料(新手必进)_第1张图片

1.1.然后导入其中的依赖


    
        org.springframework
        spring-context
        4.3.12.RELEASE
    
    
        junit
        junit
        4.12
        test
    

 1.在Java文件下创建一个Com包,写一个Person类

package com.Bean;

public class Peson {
    private String name;
    private int age;

    public Peson(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Bean{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

2.写一个Controller类,加上注解Controller

package com.Controller;

import org.springframework.stereotype.Controller;

@Controller
public class controller {
}

3.写一个dao类,加上注解Repository

package com.Dao;

import org.springframework.stereotype.Repository;

@Repository
public class dao {
}

4.在写一个Service,加上注解Service

package com.Service;

import org.springframework.stereotype.Service;

@Service
public class service {
}

5.最后写一个Config类,加上Config注解和CompanScan注解

import com.Bean.Peson;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;

@Configuration
@ComponentScan(value = "com")

public class config {
    @Bean
    public Peson peson(){
        return new Peson("kangkang",20);
    }
}

6.创建一个测试类

import com.Config.config;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestP {
    @Test
    public void test01(){
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(config.class);
        String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
        for (String name:beanDefinitionNames) {
            System.out.println(name);
        }
    }
}

7.运行后

Spring框架注解开发快速理解(IDEA)——关于ComponentScan和Filter过滤器详细资料(新手必进)_第2张图片

 2.1 我们可以看到这里面管理了所有的Bean

这个时候开始我们利用@ComponentScan Filter的规则来进行操作

让我们先来了解一下@Filter一共有几种类型

@FilterType.AnnoTatition 使用注解表达式(最常用)
@FilterType.ASSIGNABLE_TYPE 使用ASPECTJ表达式
@FilterType.REGEX 正则表达式
@FilterType.Custom 自定义规则

componentscan value:指定扫描的包

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

2.2ExcludeFilters Filter(排除里面指定的Bean)

利用@Filter的排除规则,用type指定类型用注解排除(ANNOTATION),指定怕排除Controller.class,运行后

Spring框架注解开发快速理解(IDEA)——关于ComponentScan和Filter过滤器详细资料(新手必进)_第3张图片

 发现在管理Bean中里面少了controller的

2.3IncludeFilters Filter(指定里面的Bean)

利用@Filter的排除规则,用type指定类型用注解排除(ANNOTATION),指定怕排除Controller.class,运行后

(注意,一定要先让ComponentScan里的useDefaultFilters方法改成false)

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

Spring框架注解开发快速理解(IDEA)——关于ComponentScan和Filter过滤器详细资料(新手必进)_第4张图片

2.4平常我用最多的都是用ANNOTATION,按照注解类型,还有一种也是我们需要用到的就是我们的自定义方法custom(按照自定义规则)

2.4.1首先在Config下创建一个类MyFilter,继承TypeFilter,实现其方法

import org.springframework.core.type.filter.TypeFilter;

import java.io.IOException;

public class MyFilter implements TypeFilter {
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        return false;
    }
}

2.4.2编辑方法

metadataReader  读取的是当前扫描类的的信息

metadataReaderFactory  读取包外扫描的信息

2.4.3自定义方法,扫描当前类信息,把包含dao字段的留下,其他排除

package com.Config;

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 MyFilter implements TypeFilter {
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        //当前类注解信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        //取得扫描类的信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        //取得扫描类资源的(类的路径信息)
        Resource resource = metadataReader.getResource();
        String className = classMetadata.getClassName();
        System.out.println("--"+className);
        if(className.contains("dao")){
            return true;
        }
        return false;
    }
}

2.4.4修改@Filter类型为Custom

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

2.4.5 运行得

Spring框架注解开发快速理解(IDEA)——关于ComponentScan和Filter过滤器详细资料(新手必进)_第5张图片

最后注意,Config和Person是从开始就一直包含在这Bean里

因为Config类上加有注解@Configuration,Perosn是用@Bean定义的,所以一开始就包含在里面,不管你用什么方法,它们都会存在

你可能感兴趣的:(spring,intellij-idea,java,maven)