常见注册bean对象到spring容器的方式:
-
@Component、@Controller、@Service、@Repository 方式
-
@Bean 工厂方式
-
@mport 普通类
-
@Import ImportSelector
-
@Import ImportBeanDefinitionRegistrar
-
实现 BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry
方式一:@注解方式
最常见的可以用 @Component、@Controller、@Service、@Repository 注解方式注入对象到spring容器中。
1 2 3 4
| @Component public class RequestTemplate{ }
|
1 2 3
| @Service public class UserServiceImpl implements UserService { }
|
方式二:Bean 工厂方式
1 2 3 4 5 6 7 8 9 10
| @Configuration public class AppConfig {
@Bean public User user() { return new User(); } }
|
方式三:@Import 普通类
1 2 3 4
| @Import(Cat.class) @Configuration public class AppConfig { }
|
方式四:@Import ImportSelector
可以通过 import 实现ImportSelector接口的类,重写selectImports方法可以再注册其他的类。
1 2 3 4 5 6 7
| public class UserImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{User.class.getName()}; } }
|
1 2 3 4 5 6 7 8
| @Import(UserImportSelector.class) public class ImportSelectorSpringBeanDemo {
public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(ImportSelectorSpringBeanDemo.class); System.out.println(ctx.getBean(User.class)); } }
|
方式五:@Import ImportBeanDefinitionRegistrar
通过import实现 ImportBeanDefinitionRegistrar 接口的类,重写registerBeanDefinitions方法可以再注册其他类。
1 2 3 4 5 6 7 8 9 10
| public class UserImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinition beanDefinition = new RootBeanDefinition(User.class); registry.registerBeanDefinition(User.class.getName(), beanDefinition); } }
|
1 2 3 4 5 6 7 8
| @Import(UserImportBeanDefinitionRegistrar.class) public class ImportBeanDefinitionRegistrarSpringBeanDemo {
public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(ImportBeanDefinitionRegistrarSpringBeanDemo.class); System.out.println(ctx.getBean(User.class)); } }
|
方式六:实现 BeanDefinitionRegistryPostProcessor 接口
1 2 3 4 5 6 7 8 9 10
| @Component public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Dog.class); registry.registerBeanDefinition("dog", rootBeanDefinition); } }
|
前提先注册 MyBeanDefinitionRegistryPostProcessor对象, spring容器才能触发 postProcessBeanDefinitionRegistry 方法。