Mastering @Import in Spring: Dynamic Routes and Custom Bean Registration
This article explains how the @Import annotation in the pig4cloud framework can be used to import components, implement dynamic routing, and register beans via ImportSelector and ImportBeanDefinitionRegistrar, providing concise architecture and easy activation of OAuth resource servers.
Today I share the injection forms of
@Importused in pig4cloud. Different injection methods help keep the architecture concise.
Importing a Component with @Import
The
EnablePigxDynamicRouteannotation enables dynamic data sources; simply add it to the main method.
<code>@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(DynamicRouteAutoConfiguration.class)
public @interface EnablePigxDynamicRoute {
}
</code>The core is importing the
DynamicRouteAutoConfigurationclass, which is not managed by Spring's component scan.
Simple example:
<code>public class Dog {
}
@Import({Dog.class})
@SpringBootApplication
public class SpringLearnApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringLearnApplication.class, args);
Assert.isTrue(context.containsBean("com.pig4cloud.spring.learn.demo1.Dog"), "error dog bean");
}
}
</code>Note that
Dogdoes not have the declarative annotation; it is injected as a bean by its full class name.
ImportSelector Interface
When @Import references a class that implements
ImportSelector, the selector determines which classes to import.
<code>public class DogImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// matching logic returns class names to import
return new String[]{"com.pig4cloud.spring.learn.demo1.Dog"};
}
}
</code> <code>@Import({DogImportSelector.class})
@SpringBootApplication
public class SpringLearnApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringLearnApplication.class, args);
Assert.isTrue(context.containsBean("com.pig4cloud.spring.learn.demo1.Dog"), "error dog bean");
}
}
</code>ImportBeanDefinitionRegistrar
When @Import references a class that implements
ImportBeanDefinitionRegistrar, the beans defined in
registerBeanDefinitionsare automatically registered.
Using pig's resource server configuration, it automatically registers a
PigxResourceServerConfigurerAdapterbean named
resourceServerConfigurerAdapter.
<code>public class PigxSecurityBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(PigxResourceServerConfigurerAdapter.class);
registry.registerBeanDefinition(SecurityConstants.RESOURCE_SERVER_CONFIGURER, beanDefinition);
}
}
</code>Thus, adding the
EnablePigxResourceServerannotation enables pig4cloud's packaged OAuth resource client operations, serving as the entry point of the source code.
<code>@Import({PigxSecurityBeanDefinitionRegistrar.class})
public @interface EnablePigxResourceServer {
}
</code>Java Architecture Diary
Committed to sharing original, high‑quality technical articles; no fluff or promotional content.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.