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: 法国菜豆

 

 

posted @ 2019-07-27 23:22  与君共舞  阅读(292)  评论(0编辑  收藏  举报