导入组件的方法有

方式一:自己编写的类 加入了@Controller、@Service、@Repository、@Component注解的类

方式二:通过@Bean注解导入第三方类

方式三:通过@Import直接导入第三方类(默认在Ioc容器内的名称就是全类名(包名+类名))

示例:

@Import的使用方式一

组件:下面的构造方法我加入了一条输出语句

package bean;

public class HelloWorld {
    String hello="Hello demo";

    public HelloWorld() {
        super();
        System.out.println("导入成功");
    }

    @Override
    public String toString() {
        return "HelloWorld{" +
                "hello='" + hello + '\'' +
                '}';
    }
}

spring配置类,原先通过@Bean注解导入现在直接通过@Import导入,如果输出了上面的那条“导入成功”说明导入了IOC容器中 

package config;

import bean.HelloWorld;
import org.springframework.context.annotation.*;


@Configuration
@Import(HelloWorld.class)
public class Config {

//    @Scope("prototype")
//    @Conditional({DemoCondition.class})
//    @Bean("hello")
//    public HelloWorld hello() {
//        System.out.println("bean加入ioc容器");
//        return new HelloWorld();
//    }
}

测试类

package config;

import bean.HelloWorld;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;


import static org.junit.Assert.*;

public class ConfigTest {

    @Test
    public void test1(){
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
    }
}

运行结果:

@Import注解的使用方式二 

 实现ImportSelector接口,

package config;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class DemoImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"全类名组件1","全类名组件2"};
    }
}

使用方式和前面差不多:

@Import({HelloWorld.class,DemoImportSelector.class})

其中组件的全类名要记得修改!替换其中的中文

@Import的使用方式三,实现ImportBeanDefinitionRegistrar接口

package config;

import bean.HelloWorld;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class DemoImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        boolean b1 = beanDefinitionRegistry.containsBeanDefinition("IOC容器中的组件名1");
        boolean b2 = beanDefinitionRegistry.containsBeanDefinition("IOC容器中的组件名2");
        if (b1 && b2){
            //组件1和组件2都存在则添加新组件
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(HelloWorld.class);
            beanDefinitionRegistry.registerBeanDefinition("HelloWorld",rootBeanDefinition);
        }
    }
}

使用方式和前面import一样

@Import({HelloWorld.class,DemoImportBeanDefinitionRegistrar.class})

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐