使用 xml 的方式来声明 Bean 的定义,Spring 容器在启动的时候会加载并解析这个 xml,把 bean 装载到 IOC 容器中。
使用@CompontScan 注解来扫描声明了@Controller、@Service、 @Repository、@Component 注解的类。
使用@Configuration 注解声明配置类,并使用@Bean 注解实现 Bean 的定义,这种方式其实是 xml 配置方式的一种演变,是 Spring 迈入到无配置化时代的里程碑。
使用@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})
使用 FactoryBean 工厂 bean,动态构建一个 Bean 实例,Spring CloudOpenFeign 里面的动态代理实例就是使用 FactoryBean 来实现的。
实现 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定义,提供了更灵活的配置和扩展机制。
实现 ImportSelector 接口,动态批量注入配置类或者 Bean 对象,这个在 SpringBoot 里面的自动装配机制里面有用到