Spring注解創建Bean的幾種方式
1、@Component系列
@Component @Service @Repository @Controller @Configuration
2、 依附於@Configuration的注解
@Bean 創建Deom
@Configuration
public class Demo {
@Bean
public Demo demo(){
return new Demo();
}
}
@Import 創建Cofing
@Configuration
@Import(Config.class)
public class Demo {
}
@Import.ImportSelector 選擇器,傳入@Import注解所在類Demo上所有的注解信息,返回要導入的類名
@Configuration
@Import(ImportSelector_.class)
public class Demo {
}
public class ImportSelector_ implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.spring.demo.beanlifecycle.Demo"};
}
}
@Impport.ImportBeanDefinitionRegistrar Bean定義注冊器,傳入@Import注解所在類Demo上所有的注解信息(1),Bean定義注冊器(2)
//PS:Mybatis的Mapper接口就是用這種方式將Bean定義注冊到Spring上下文的
@Configuration
@Import(ImportBeanDefinitionRegistrar_.class)
public class Demo {
}
public class ImportBeanDefinitionRegistrar_ implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Bean.class).setInitMethodName("init").setDestroyMethodName("destroy").getBeanDefinition();
registry.registerBeanDefinition("bean", beanDefinition);
System.out.println("registerBeanDefinitions: " + beanDefinition);
}
}
3、FactoryBean
當通過“factoryBean”獲取實例時,FactoryBean會調用getObject()方法
當通過“&factoryBean”獲取實例時,返回FactoryBean的實例
當通過Demo.class來獲取bean實例時,調用factoryBean的getObjectTyoe()來獲取類型。
@Configuration
public class Demo {
@Bean
public FactoryBean_ factoryBean(){
return new FactoryBean_();
}
}
public class FactoryBean_ implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new Demo();
}
@Override
public Class<?> getObjectType() {
return Demo.class;
}
}
