Spring注解开发1--- @Configuration @Bean @ComponentScan

Spring注解开发:去掉之前的配置文件,现在采用配置类来实现所有的开发。

这些注解只需要导入Spring-context包就可以满足

目录

 

1.@Configuration表明当前类是一个配置类

2.@Bean表示把当前类放入Spring容器中

3.@ComponentScan


1.@Configuration表明当前类是一个配置类

2.@Bean表示把当前类放入Spring容器中

配置文件:

@Configuration   //告诉spring这是一个配置类
public class MainConfig {

    @Bean      //给容器中注册一个bean,类型为返回的类型,默认id是方法名(这里方法名是user)
    public  User user(){
        return  new User("vison",23);
    }
}

//上面如果需要自定义给bean定义id名可以通过@Bean(name="user")  实现

测试文件:

public class TestAnotation {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        User user = configApplicationContext.getBean(User.class);
        System.out.println(user);
    }
}

3.@ComponentScan

类似于以前配置文件中的context:component-scan,这里使用注解扫描以前的@Controller,@Service,@Repository,@Component

例子:建议看注解源码了解怎么使用注解内的属性

@Configuration
@ComponentScan(value = "com.wusu",excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class,Service.class})
})
//value :表示需要扫描的包
//excludeFilters = Filter[] :指定扫描的时候按照什么规则排除某些组件
//includeFilters = Filter[] :指定扫描的时候只需要包含某些组件
public class MainConfig {
    @Bean
    public  User user(){
        return  new User("vison",23);
    }
}

3.1   上面例子中value表示需要扫描的包,excludeFilters表示在包含的包中需要排除的类型,这里type表示通过怎么样的方式排除某些组件;这里是注解,后面的classes表示通过注解排除@Controller和@Service注解,不扫描这些注解的类。

3.2 除了排除扫描外,还有只扫描某一些包或者类的注解@includeFilters;由于@ComponetScan有一个默认属性useDefaultFilter是扫描所有的包,所以在只扫描扫描某些包的时候,需要把这个属性设置为false;如下表示只包含Controller和Service.class两个注解的包。

@Configuration
@ComponentScan(value = "com.wusu",useDefaultFilters = false,includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class,Service.class})
})
public class MainConfig {
    @Bean
    public  User user(){
        return  new User("vison",23);
    }
}

3.3 上面过滤的时候type类型有:

public enum FilterType {
    ANNOTATION,        //通过注解过滤,常用,上面的例子就是这个
    ASSIGNABLE_TYPE,    //通过类型过滤,常用
    ASPECTJ,            //通过aspectJ过滤    
    REGEX,              //通过正则表达式过滤
    CUSTOM;            //自定义过滤,这个需要自己实现TypeFilter类

    private FilterType() {
    }
}

3.4 使用CUSTOM自定义规则过滤,过滤后,自己的新建的过滤类myFilter也是会自动加入到Spring容器中

配置类:

@Configuration
@ComponentScan(value = "com.wusu",useDefaultFilters = false,includeFilters = {
        @ComponentScan.Filter(type = FilterType.CUSTOM,classes = MyFilter.class)
})
//这里type使用CUSTOM表示自定义规则,classes使用自定义规则的类
public class MainConfig {
    @Bean
    public  User user(){
        return  new User("vison",23);
    }
}

过滤类:

public class MyFilter implements TypeFilter {
    //metadataReader  读取到当前类正在扫描的类
    //metadataReaderFactory 可以获取到其他任何类的信息
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        //获取当前类的注解信息
        AnnotationMetadata annotationMetadata =  metadataReader.getAnnotationMetadata();
        //获取当前类的类信息,包括类的类名,接口等信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        //获取当前类资源(类的路径)
        Resource resource = metadataReader.getResource();
        if (classMetadata.getClassName().contains("wusu")){  //这里表示类名包含wusu的才能被扫描存入spring容器中
            return  true;
        }
        return false;
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_40792878/article/details/82779591