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 对象