基于注解和类的组件注册

@Conditional

作用:按照一定的条件进行判断,如果满足条件的话就给spring容器中注册bean

​ 该注解既可以标注到方法上面,也可以标注到类上面(只有满足条件时,当前类中配置的bean才能注册)

属性:Class<? extends Condition>[] value()

​ value属性需要创建一个实现Condition接口的类并且重写其中的matches方法

public class testCondition implements Condition {
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return false;
    }
}

示例:想要实现如果当前是在windows系统下就注册bill如果是在linux下就注册linus

MyConfig配置类

@Configuration
@ComponentScan("com.zl")
public class MainConfig {

    @Bean("bill")
    @Conditional(WindowsCondition.class)
    public Person person01(){
        return new Person("bill",50);
    }
    @Bean("linus")
    @Conditional(LinuxCondition.class)
    public Person person02(){
        return new Person("linus",49);
    }
}

WindowsCondition

public class WindowsCondition implements Condition {
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        String property = environment.getProperty("os.name");
        if (property.contains("Windows")){
            return true;
        }
        return false;
    }
}

LinuxCondition

public class LinuxCondition implements Condition {
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        String property = environment.getProperty("os.name");
        if (property.contains("Linux")){
            return true;
        }
        return false;
    }
}

测试类

public class IocTest {
    private ApplicationContext applicationContext;

    @Before
    public void init(){
        applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
    }
    @Test
    public void testConditional(){
        String[] names = applicationContext.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}
//因为是在windows环境下运行,所以IOC容器中注册的就是bill

@Import()

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {

    /**
     * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
     * or regular component classes to import.
     */
    Class<?>[] value();

}

我们这里来分析一下{@link ImportBeanDefinitionRegistrar}以这种方式来注册bean

作用:我们可以通过给@Import注解传入一个实现了ImportBeanDefinitionRegistrar的类来完成注册bean

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    /**
     * AnnotationMetadata: 当前标注@Import注解类的所有注解信息
     * BeanDefinitionRegistry: BeanDefinition注册类
     * @param importingClassMetadata
     * @param registry
     */
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        registry.registerBeanDefinition("person",new RootBeanDefinition(Person.class));
    }
}

FactroyBean

作用:我们可以创建一个实现FactoryBean接口的工厂类,并且实现其中的方法,从而完成bean的注册

PersonFactoryBean工厂类

public class PersonFactoryBean implements FactoryBean {
    //返回一个Person对象并且添加到容器当中
    public Object getObject() throws Exception {
        return new Person();
    }
    //返回bean对象的类型
    public Class<?> getObjectType() {
        return Person.class;
    }
    //创建的bean对象是否单例?
    public boolean isSingleton() {
        return false;
    }
}

在MyConfig中配置PersonFactoryBean

@Bean
public PersonFactoryBean personFactoryBean(){
    return new PersonFactoryBean();
}

测试类

@Test
    public void testPersonFactoryBean(){
        Object bean1 = applicationContext.getBean("personFactoryBean");
        System.out.println(bean1.getClass());
        Object bean2 = applicationContext.getBean("&personFactoryBean");
        System.out.println(bean2.getClass());
    }
    /**
     * 通过测试我们发现当我们从IOC容器中获取personFactroyBean对象时,得到的是我们通过
     * PersonFactroyBean中的 getObject()方法创建的Person对象
     *
     * 如果想要获取到PersonFactoryBean对象的话就要在name属性前加上&
     */

spring组件注册的更多相关文章

  1. 【spring 注解驱动开发】spring组件注册

    尚学堂spring 注解驱动开发学习笔记之 - 组件注册 组件注册 1.@Configuration&@Bean给容器中注册组件 2.@ComponentScan-自动扫描组件&指定扫 ...

  2. spring 组件注册

    一.声明配置类和注册 bean /** * 配置类 == applicationContext.xml 配置文件 * @author Administrator * */ //@Configurati ...

  3. Spring 注解原理(一)组件注册

    Spring 注解原理(一)组件注册 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 当我们需要使用 Spring 提供的 ...

  4. spring注解扫描组件注册

    最近对单点系统进行微服务拆分,被各个springboot的组件注册搞得云里雾里的.(有的是通过springboot的自动配置进IOC容器的,有的是自己添加构造方法添加进IOC容器.)决定抽时间将spr ...

  5. Spring注解开发-全面解析常用注解使用方法之组件注册

    目录 1. @Configuration 2. @ComponentScan excludeFilters includeFilters 使用自定义TypeFilter 3. @Bean @Scope ...

  6. Spring Framework 组件注册 之 @Import

    Spring Framework 组件注册 之 @Import 写在前面 向spring中注册组件或者叫javaBean是使用spring的功能的前提条件.而且spring也提供了很多种方式,让我们可 ...

  7. Spring Framework 组件注册 之 @Component

    Spring Framework 组件注册 之 @Component 写在前面 在spring大行其道的今天,对于spring的使用和掌握乃是不可缺少的必备技能.但是spring的整个体系尤为庞大,对 ...

  8. Spring Framework 组件注册 之 FactoryBean

    Spring Framework 组件注册 之 FactoryBean 前言 前两篇文章介绍了如何使用@Component,@Import注解来向spring容器中注册组件(javaBean),本文将 ...

  9. Spring注解开发系列Ⅰ--- 组件注册(上)

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...

随机推荐

  1. 2、大型项目的接口自动化实践记录--接口测试简介及RequestsLibrary关键字简介

    1.接口测试简介 1)先简单介绍下接口测试,那么什么是接口测试呢? 百科的回答:接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点. 看起来有 ...

  2. Tomcat源码分析 (二)----- Tomcat整体架构及组件

    前言 Tomcat的前身为Catalina,而Catalina又是一个轻量级的Servlet容器.在美国,catalina是一个很美的小岛.所以Tomcat作者的寓意可能是想把Tomcat设计成一个优 ...

  3. Android使用com.google.android.cameraview.CameraView进行拍照

    import android.Manifest;import android.annotation.SuppressLint;import android.content.Context;import ...

  4. JVM总结(三)

    JVM总结(3)Class文件,类加载机制.编译过程 Java编译器先把Java代码编译为存储字节码的Class文件,再通过Class文件进行类加载. Class类文件的结构 Java编译器可以把Ja ...

  5. 牛客多校训练第八场C.CDMA(思维+构造)

    题目传送门 题意: 输入整数m( m∈2k ∣ k=1,2,⋯,10),构造一个由1和-1组成的m×m矩阵,要求对于任意两个不同的行的内积为0. 题解: Code: #include<bits/ ...

  6. 素数筛法(Eratosthenes筛法)

    介绍 Eratosthenes筛法,又名埃氏筛法,对于求1~n区间内的素数,时间复杂度为n log n,对于10^6^ 以内的数比较合适,再超出此范围的就不建议用该方法了. 筛法的思想特别简单: 对于 ...

  7. .Net Core 最优 MD5 打开方式!初学者建议收藏(支持 SHA1,SHA256,.Net Framework)

    public static string GetMd5Hash(string input) { using (MD5 md5Hash = MD5.Create()) { // Convert the ...

  8. JS鼠标吸粉特效

    HTML <canvas id=canvas></canvas> CSS * { margin: 0; padding: 0; } html { overflow: hidde ...

  9. testlink搭建教程

    1,下载testlink安装包   请加QQ群299524235,在群文件中下载     2.配置Apache环境和PHP环境   解压testlink文件到Apache中, 通过127.0.0.1/ ...

  10. 使用文本框TextView/EditText的开源库清单

    在实际的开发中TextView和EditText是非常基本的控件.这两个控件的使用也是十分简单.而TextView/EditText的功能其实也是非常强大,例如简单的图文就可以使用TextView配合 ...