• spring组件注册


    一、@Bean

    默认为单实例,给容器中注册一个bean,类型为返回值的类型,id默认是方法名作为id

    单实例bean:默认在容器启动时创建对象

    1、 @Lazy:针对单实例bean,容器启动不创建对象,第一次获取bean创建对象,并进行初始化。

    @Configuration
    public class MainConfig {
    
        //给容器中注意一个bean,类型为返回值的类型,id默认是方法名作为id
        @Bean
        @Lazy
        public Person person() {
            return new Person("jack", 12);
        }
    }  

    2、@Scope

    prototype:多实例,IOC容器启动不会调用方法创建对象放在容器中,每次获取的时候才会调用方法创建对象。
    singleton:单实例, IOC容器启动会调用方法创建对象到IOC容器中,以后每次获取值都是直接从容器中拿。
    request:同一次请求创建一个实例
    session:同一次session创建一个实例
    @Configuration  //告诉Spring这是一个配置类
    public class MainConfig {
        //给容器中注册一个bean,类型为返回值的类型,id默认是方法名作为id
       @Bean
       @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
        public Person person() {
            return new Person("jack", 12);
        }
    }
    

    3、@Conditional

    按照一定的条件进行判断,满足条件给容器中注册bean

    @Configuration
    public class MainConfig {
        //如果是mac系统,给容器中注册@Bean("mac")
        @Conditional({MacCondition.class})
        @Bean("mac")
        public Person person01() {
            return new Person("Mac OS X", 62);
        }
    }
    
    
    
    public class MacCondition implements Condition {
    
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    
            //3.获取当前环境信息
            Environment environment = context.getEnvironment();
    
            String property = environment.getProperty("os.name");
    
            if (property.contains("Mac")) {
                return true;
            }
            return false;
        }
    }

    二、@ComponentScan

    包扫描+组件标注注解 @Controller/@Service/@Repository/@Component

     value:指定要扫描的包
     excludeFilters =Filter[] :指定扫描的时候按照什么规则排除那些组件
     includeFilters = Filter[] :指定扫描的时候只需要包含哪些组件
     FilterType.ANNOTATION:按照注解
     FilterType.ASSIGNABLE_TYPE:按照给定的类型;
     FilterType.ASPECTJ:使用ASPECTJ表达式
     FilterType.REGEX:使用正则指定
     FilterType.CUSTOM:使用自定义规则

    样例:

    @ComponentScan(value = "com.cn",
      includeFilters = {
                      @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class}),
                      @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes ={BookService.class}),
      @ComponentScan.Filter(type = FilterType.CUSTOM,classes = MyTypeFilter.class)
      }, useDefaultFilters = false)
    @Configuration  //告诉Spring这是一个配置类
    public class MainConfig {
    }
    
    
    
    public class MyTypeFilter implements TypeFilter {
    
        /**
         * metadataReader 读取到当前正在扫描的信息
         * metadataReaderFactory 可以获取到其他任何类的信息
         */
        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("er")){
                return true;
            }
    
            return false;
        }
    }

    三、@Import

    @Import(Color.class)导入组件,id默认是组件的全类名

    ImportSelector(接口):返回需要导入的组件的全类名数组

    ImportBeanDefinitionRegistrar:手动注册bean到容器中

    @Configuration
    @Import({Color.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class}) //导入组件,id默认是组件的全类名
    public class MainConfig2 {
    
    }
    
    public class Color {
    }
    
    //自定义逻辑返回需要导入的组件
    public class MyImportSelector implements ImportSelector {
      
      //AnnotationMetadata 当前标注@Import注解的类的所有注解信息
        public String[] selectImports(AnnotationMetadata importingClassMetadata) {
            return new String[]{"com.cn.bean.Blue", "com.cn.bean.Yellow"};
        }
    }
    
    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
        /**
         * AnnotationMetadata
         * BeanDefinitionRegistry
         */
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            boolean definition = registry.containsBeanDefinition("com.cn.bean.Yellow");
            boolean definition2 = registry.containsBeanDefinition("com.cn.bean.Blue");
            if (definition && definition2) {
                //指定
                RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(RainBow.class);
                registry.registerBeanDefinition("rainBow", rootBeanDefinition);
            }
        }
    }

    四、FactoryBean

    工厂bean获取的是调用getObject创建的对象

    @Configuration
    public class MainConfig{
       
     @Bean
        public ColorFactoryBean colorFactoryBean(){
            return new ColorFactoryBean();
        }
    }
    
    
    public class ColorFactoryBean implements FactoryBean<Color>{
    
        //返回一个color对象,这个对象会添加到容器中
        public Color getObject() throws Exception {
            return new Color();
        }
        
        public Class<?> getObjectType() {
            return Color.class;
        }
    
        /**
         *     true,bean是单实例,在容器中保存一份
         *     false 多实例,每次获取都会创建一个新的bean
         */
        public boolean isSingleton() {
            return false;
        }
    }
    

      

      

     

      

      

      

      

      

      

      

    bean  [biːn]  详细X
    基本翻译
    n. 豆;嘴峰;毫无价值的东西
    n. (Bean)人名;(英)比恩
    vt. 击…的头部
    网络释义
    bean: 菜豆
    Coffee Bean: 咖啡豆
    French bean: 法国菜豆

  • 相关阅读:
    解决Enterprise Library January 2006不能加密配置文件的方法
    ASP.NET Ajax 和ASP.NET 2.0 的登陆控件相冲突的问题的讨论
    十二时辰与时间对照表,十二经络时辰表
    对表中数据逐行累加
    SQL脚本 CASE...WHEN...THEN...ELSE...END 的应用
    [转]看刚毕业MM如何在北京买房
    让你的GUI程序随WINDOWS服务一起启动
    启动Oracle,SQL服务,IIS脚本
    无论买新房还是二手房 教你六招可放心收房
    经典开源项目简介及源码下载
  • 原文地址:https://www.cnblogs.com/wjh123/p/11257272.html
Copyright © 2020-2023  润新知