将Bean注入Spring容器有哪些方法
一,通过@ComponentScan扫描@Component标注的类将bean注入spring容器中
二,通过获取@Configuration和@Bean配合将bean注入spring容器
三,通过@Import
3.1 通过@Import注入某个bean
3.1.1 @Import(Test.class)
3.2 通过@Import注入ImportSelector的实现类
3.2.1
public class TestImportSelector implements ImportSelector {
@Override
public String[ ] selectImports ( AnnotationMetadata importingClassMetadata ) {
return new String [ ] { "com.test.importdemo.Test" } ;
}
}
3.3 通过@Import注入ImportBeanDefinitionRegistor的实现类
3.3.1
public class TestImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions ( AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry ) {
RootBeanDefinition test = new RootBeanDefinition ( Test. class) ;
registry. registerBeanDefinition ( "test" , test) ;
}
}
四,通过实现BeanDefinitionRegistorPostProcessor接口
4.1
public class Demo {
public static void main ( String[ ] args ) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext ( ) ;
TestBeanDefinitionRegistryPostProcessor beanDefinitionRegistryPostProcessor = new TestBeanDefinitionRegistryPostProcessor ( ) ;
applicationContext. addBeanFactoryPostProcessor ( beanDefinitionRegistryPostProcessor) ;
applicationContext. refresh ( ) ;
Test bean = applicationContext. getBean ( Test. class) ;
System. out. println ( bean) ;
}
}
class TestBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry ( BeanDefinitionRegistry registry) throws BeansException {
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder. rootBeanDefinition ( Test. class) . getBeanDefinition ( ) ;
registry. registerBeanDefinition ( "test" , beanDefinition) ;
}
@Override
public void postProcessBeanFactory ( ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
五,通过实现FactoryBean接口
5.1
@Configuration
public class Demo {
@Bean
public PersonFactoryBean personFactoryBean ( ) {
return new PersonFactoryBean ( ) ;
}
public static void main ( String[ ] args ) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext ( Demo. class) ;
Test bean = applicationContext. getBean ( Test. class) ;
System. out. println ( bean) ;
}
}
class TestFactoryBean implements FactoryBean < Test> {
@Override
public Test getObject ( ) throws Exception {
return new Test ( ) ;
}
@Override
public Class< ? > getObjectType ( ) {
return Test. class;
}
}