Spring创建Bean的几种方式

1.xml配置
无参构造


静态工厂


实例工厂



2.注解

@Componse、@Service、@Controller、@Repository

3.javaConfig

@Configuration
public classUserConfiguration{
  @Bean
  public User user(){
    return new User();
  }
}

4.使用@Import,一般在自定义扩展的时候使用

@Import(User.class)
public class webApplication{
  public static void main(String[] args){
    
  }
}

5.实现ImportSelector或者ImportBeanDefinitionRegistrar接口

这个一般会结合@Import一起使用,通过扩展自定义注解的方式来实现动态Bean注入

// 设置class
public class MyImportSelector implements ImpportSelector{
  @Override
  public String[] selectImports(AnnotationMetadata annotationMetadata){
    return new String[]{User.class.getName()};
  }
}
// 创建自定义的BeanDefinition
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
  @Override
  public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry){
    BeanDefinition beanDefinition =  new RootBeanDefinition(User.class.getName());
    beanDefinitionRegistry.registerBeanDefinition(User.class.getName(),beanDefinition);
  }
}
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
@Import({MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public @interface EnableImportSelector {

    String value();

}

6.手动注入Bean实例,或者BeanDefinition

@Component
public class LocationRegister implements BeanFactoryAware {

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        DefaultListableBeanFactory listableBeanFactory = (DefaultListableBeanFactory)beanFactory;
    //方式1
   // Location location = new Location();
   // listableBeanFactory.registerSingleton(Location.class.getName(),location);

    //方式2
    BeanDefinition locationBeanDefinition = new RootBeanDefinition(Location.class);
    listableBeanFactory.registerBeanDefinition(Location.class.getName(),locationBeanDefinition);

    }
}

7.FactoryBean实现Bean注入

实现FactoryBean接口,重写getObject()方法

8.通过Supplier方式创建Bean

// 方式1
AnnotationConfigApplicationContext.registerBean("user",new Supplier(){
            @Override
            public User get(){
                return new User();
            }
        });
// 方式2
GenericBeanDefinition beanDefinition=new GenericBeanDefinition();
beanDefinition.setInstanceSupplier(()->new User());
AnnotationConfigApplicationContext.registerBeanDefinition("user", beanDefinition);

9.通过Spring boot starter的方式

在resources下创建META-INF/spring.factories文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.test.UserConfiguration
public class UserConfiguration{
      @Bean
      public User user(){
           return new User();
      }
}

你可能感兴趣的:(Spring创建Bean的几种方式)