IOC 容器中添加组件的方式

1、通过@CompentScan +@Controller @Service @Respository @compent

适用场景: 针对我们自己写的组件可以通过该方式来进行加载到容器中。
 
2、通过@Bean的方式来导入组件(适用于导入第三方组件的类)
 
3、通过@Import来导入组件
3.1、导入类
@Configuration @Import(value = {Person.class, Car.class}) 
public class MainConfig { }

3.2、导入ImportSeletor类实现组件

public class MyImportSelector implements ImportSelector { 
//可以获取导入类的注解信息 
  @Override 
  public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.my.testimport.compent.Car"};
}
}

@Configuration @Import(value
= {Person.class, Car.class, MyImportSelector.class})
public class MainConfig { }

springboot的自动注入就是用了这种方式

3.3、导入 ImportBeanDefinitionRegister类的实现组件

public class MyBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
  @Override 
  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    //创建一个bean定义对象 
    RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Cat.class); 
    //把bean定义对象导入到容器中 
    registry.registerBeanDefinition("cat",rootBeanDefinition); 
  } 
}
@Configuration 
@Import(value = {Person.class, Car.class, MyImportSelector.class, MyBeanDefinitionRegister.class}) 
public class MainConfig { }

aop的实现注册类AutoProxyRegistrar就是实现了ImportBeanDefinitionRegister类

 4、通过实现FacotryBean接口来实现注册组件

@Component
public
class CarFactoryBean implements FactoryBean<Car> { //返回bean的对象 @Override public Car getObject() throws Exception { return new Car(); } //返回bean的类型 @Override public Class<?> getObjectType() { return Car.class; } //是否为单利 @Override public boolean isSingleton() { return true; } }

 spring获取对象是返回的是getObject方法返回的对象,要想返回fanctoryBean对象,需要在获取对象名前加上&符号

即 getBean("carFactoryBean" )返回car对象,

    getBean("&carFactoryBean" )返回CarFactoryBean 对象

posted @ 2020-11-09 09:46  梦天幻  阅读(377)  评论(0编辑  收藏  举报