Spring框架注解式开发(IDEA)——关于@Import注解的具体使用

大家都知道我们给容器中定义组件有个方式,

@Bean,容器来添加作为Bean

还有包扫描注解,比如@Conrtroller,@Service,@Respiratory,@Component

还有一种就是@Import【快速给容器添加一个组件】

把Bean就是导在容器中,调用无参构造器,创建一个对象

1.1第一种方法定义Bean组件

package com.Config;

import com.Bean.Person;
import com.Conditional.Linux;
import com.Conditional.windows;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;


public class MainConfig {
    
   
    @Bean("bill")
    public Person person1(){
        return new Person("Bill",60);
    }

    
    @Bean("Lin")
    public Person person2(){
        return new Person("Lin",48);
    }
}

1.2创建测试类

import com.Bean.Person;
import com.Config.MainConfig;
import com.Config.config;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

public class TestP {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
    @Test
    public void testImport() {
        printBean(applicationContext);
    }

    private void printBean(AnnotationConfigApplicationContext annotationConfigApplicationContext) {
        String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
        for (String name : beanDefinitionNames) {
            System.out.println(name);
        }
    }}

1.3运行后

 利用Bean添加组件

二 利用Import添加组件 

2.1 创建一个Color类

package com.Bean;

public class Color {
}

2.2 在MainConfig中添加@Import注解

package com.Config;

import com.Bean.Color;
import com.Bean.Person;
import com.Conditional.Linux;
import com.Conditional.windows;
import org.springframework.context.annotation.*;


@Import(Color.class)
public class MainConfig {




    @Bean("bill")
    public Person person1(){
        return new Person("Bill",60);
    }


    @Bean("Lin")
    public Person person2(){
        return new Person("Lin",48);
    }
}

2.3 测试运行

运行后我们发现Color也被添加到IOC里来

 三.关于Import有三种方法添加组件,一种就是我们刚刚看到的添加@Import注解,在里面直接添加类。

还有就是添加ImportSelect:返回需要导入组件的全类名

3.1新建一个类MyImportSelect实现ImportSelector接口,在实现其方法

package com.Conditional;

import com.Bean.Blue;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class MyImportSelect implements ImportSelector {
    //AnnotationMetadata:只能获取到@Import注释类的信息
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"com.Bean.Blue"};
    }
}

3.2 新建一个Blue类

package com.Bean;

public class Blue {
}

3.3在Config中@Import里添加MyImportSelect类

package com.Config;

import com.Bean.Color;
import com.Bean.Person;
import com.Conditional.Linux;
import com.Conditional.MyImportSelect;
import com.Conditional.windows;
import org.springframework.context.annotation.*;

@Conditional({windows.class})
@Import({Color.class, MyImportSelect.class})
public class MainConfig {




    @Bean("bill")
    public Person person1(){
        return new Person("Bill",60);
    }


    @Bean("Lin")
    public Person person2(){
        return new Person("Lin",48);
    }
}

3.4 运行后

发现我们利用这种自定义组件也加载进来了

三.利用ImportBeanDefinitionRegistrar加载Bean

3.1 创建Rainbow类

package com.Bean;

public class Rainbow {
}

3.2新建一个MyImportBeanDefinitionRegistrar实现ImportBeanDefinitionRegistrar接口,并实现其方法

package com.Conditional;

import com.Bean.Rainbow;
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 MyImportBeanDefinitionRegistar implements ImportBeanDefinitionRegistrar {

    //AnnotationMetadata:当前类的注解信息
    //BeanDefinitionRegistry:注册类信息  可以吧所有需要添加到容器中的bean,调用BeanDefinitionRegistry.registerBean手工注册进来
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        boolean blue = beanDefinitionRegistry.containsBeanDefinition("com.Bean.Blue");
//判断Bean容器中是否有包含Blue的bean,如果有Blue这个bean在添加rainbow
        if(blue){
            //bean名自定义类名
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Rainbow.class);
            beanDefinitionRegistry.registerBeanDefinition("rainbow",rootBeanDefinition);
        }
    }
}

 3.3在@Import注解中添加MyportBeanDefinitionRegistrar

package com.Config;

import com.Bean.Color;
import com.Bean.Person;
import com.Conditional.Linux;
import com.Conditional.MyImportBeanDefinitionRegistar;
import com.Conditional.MyImportSelect;
import com.Conditional.windows;
import org.springframework.context.annotation.*;

@Conditional({windows.class})
@Import({Color.class, MyImportSelect.class, MyImportBeanDefinitionRegistar.class})
//ImportBeanDefinitionRegistar:
public class MainConfig {




    @Bean("bill")
    public Person person1(){
        return new Person("Bill",60);
    }


    @Bean("Lin")
    public Person person2(){
        return new Person("Lin",48);
    }
}

3.4运行

 利用ImportBeanDefinitionRegistrar添加到IOC容器中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值