Spring注解創建Bean的幾種方式


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;
    }
}

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM