Spring 中有哪些方式可以把 Bean 注入到 IOC 容器?

目录

    • 1、xml方式
    • 2、@CompontScan + @Component
    • 3、使用 @Bean方式
    • 4、使用@Import 注解
    • 5、FactoryBean 工厂 bean
    • 6、使用 ImportBeanDefinitionRegistrar 向容器中注入Bean
    • 7、实现 ImportSelector 接口

1、xml方式

使用 xml 的方式来声明 Bean 的定义,Spring 容器在启动的时候会加载并解析这个 xml,把 bean 装载到 IOC 容器中。

2、@CompontScan + @Component

使用@CompontScan 注解来扫描声明了@Controller、@Service、 @Repository、@Component 注解的类。

3、使用 @Bean方式

使用@Configuration 注解声明配置类,并使用@Bean 注解实现 Bean 的定义,这种方式其实是 xml 配置方式的一种演变,是 Spring 迈入到无配置化时代的里程碑。

4、使用@Import 注解

使用@Import 注解,导入配置类或者普通的 Bean

在Spring中,使用@Import注解可以将其他配置类(Configuration类)中定义的Bean引入到当前的配置类中。这允许你在一个配置类中引入其他配置类,从而将它们的Bean定义整合到一个应用上下文中。

以下是使用@Import注解的简单示例:

@Configuration
public class AppConfig1 {
    @Bean
    public MyBean myBean() {
        return new MyBean();
    }
}

@Configuration
@Import(AppConfig1.class)
public class AppConfig2 {
    // AppConfig2 中可以直接使用 AppConfig1 中定义的 MyBean
}

在上述示例中,AppConfig2通过@Import(AppConfig1.class)注解引入了AppConfig1中的Bean定义。这样,在AppConfig2中就可以直接使用AppConfig1中定义的MyBean。

你还可以一次引入多个配置类,只需要在@Import注解中传入一个包含所有要引入的配置类的数组,如:

@Import({AppConfig1.class, AnotherConfig.class, YetAnotherConfig.class})

5、FactoryBean 工厂 bean

使用 FactoryBean 工厂 bean,动态构建一个 Bean 实例,Spring CloudOpenFeign 里面的动态代理实例就是使用 FactoryBean 来实现的。

6、使用 ImportBeanDefinitionRegistrar 向容器中注入Bean

实现 ImportBeanDefinitionRegistrar 接口,可以动态注入 Bean 实例。这个在Spring Boot 里面的启动注解有用到。

ImportBeanDefinitionRegistrar是Spring提供的一个接口,允许你在运行时动态地注册Bean定义到Spring容器中。通过实现这个接口,你可以在配置类上使用@Import注解,并在registerBeanDefinitions方法中自定义添加Bean定义。

以下是一个简单的示例,演示如何使用ImportBeanDefinitionRegistrar接口注入一个Bean:

创建需要注入的Bean:

public class MyInjectedBean {
    // ...
}

实现ImportBeanDefinitionRegistrar接口:

public class MyBeanRegistrar implements ImportBeanDefinitionRegistrar, EnvironmentAware {

    private Environment environment;

    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        // 通过注册Bean定义的方式将 MyInjectedBean 注入到 Spring 容器中
        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(MyInjectedBean.class);
        registry.registerBeanDefinition("myInjectedBean", beanDefinition);
    }
}

在配置类中使用@Import注解导入ImportBeanDefinitionRegistrar:

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(MyBeanRegistrar.class)
public class AppConfig {
    // 此处不需要声明 MyInjectedBean 的 @Bean 方法,它会由 MyBeanRegistrar 动态注册
}

在这个示例中,MyBeanRegistrar实现了ImportBeanDefinitionRegistrar接口,并在registerBeanDefinitions方法中注册了MyInjectedBean的Bean定义。然后,在AppConfig配置类中使用@Import注解将MyBeanRegistrar导入,从而在Spring容器中动态注册了MyInjectedBean。

这种方式允许你在运行时根据需要动态地注册Bean定义,提供了更灵活的配置和扩展机制。

7、实现 ImportSelector 接口

实现 ImportSelector 接口,动态批量注入配置类或者 Bean 对象,这个在 SpringBoot 里面的自动装配机制里面有用到

你可能感兴趣的:(#,Spring,spring)