Spring容器注册bean有哪些方式?

常见注册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
4
@Service
public class UserServiceImpl implements UserService {
  
}

方式二:Bean 工厂方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
@Configuration
public class AppConfig {
    /**
     * 注册 user对象,默认方法名为beanName
    */
    @Bean
    public User user(){
        return new User();
    }
}

方式三:@Import 普通类

1
2
3
4
5
@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) {
       // 注册User类型到spring容器中
        return new String[]{User.class.getName()};
    }
}
1
2
3
4
5
6
7
8
9

@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) {
				
       // 注册User的ben定义
        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
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
				// 注册其他bean
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Dog.class);
        registry.registerBeanDefinition("dog", rootBeanDefinition);
    }

前提先注册 MyBeanDefinitionRegistryPostProcessor对象, spring容器才能触发 postProcessBeanDefinitionRegistry 方法。

0%