天天看點

spring中建立bean的幾種方式

作者:王朋code

方式一:使用正常的注解

@Component
public class DiscountInfo {} 
@Controller、@Service、@repository等,本質跟@Component一樣
public class DiscountInfo {} 
@Configuration,,本質跟@Component一樣
public class DiscountInfo {} 
//此方式注意,使用@Import注解時,通過容器擷取bean,使用getBean()并不能通過名字去擷取,而是需要使用對應的.class 
@Configuration @ComponentScan("com.bboss.business.ecloud.bean") 
@Import(DiscountInfo.class)
public class MyConfig {}           

方式二:在配置類中使用@Bean

@Configuration 
@ComponentScan("com.bboss.business.ecloud.bean") 
public class MyConfig { 
  @Bean 
  public DiscountInfo discountInfo(){ 
    return new DiscountInfo(); 
  } 
}           

方式三:使用spring的配置檔案和@ImportResource注解

@Configuration 
@ComponentScan("com.bboss.business.ecloud.bean") 
@ImportResource("classpath:spring.xml") 
public class MyConfig { } 
//在resource目錄下:           
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="discountInfo" class="com.bboss.business.ecloud.bean.DiscountInfo">
    </bean>
</beans>           

方式四:實作BeanDefinitionRegistryPostProcessor接口來建立bean對象

//BeanDefinition在Spring中是用來描述Bean對象的,其不是一個bean執行個體,僅僅是包含bean執行個體的所有信,比如屬性值、構造器參數以及其他資訊。
//Bean對象建立是根據BeanDefinitionc中描述的資訊來建立的,BeanDefinitionc存在的作用是為了可以友善的進行修改屬性值和其他元資訊。
//比如通過BeanFactoryPostProcessor進行修改一些資訊,然後在建立Bean對象的時候就可以結合原始資訊和修改後的資訊建立對象了。
@Component
public class MyBeanDefinitionPostProcessor implements BeanDefinitionRegistryPostProcessor {
    //注冊器
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
        beanDefinition.setBeanClass(DiscountInfo.class);
        registry.registerBeanDefinition("discountInfo",beanDefinition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

    }
}           

方式五:實作FactoryBean接口重寫方法/SmartFactoryBean接口

@Component
public class MyFactoryBean implements FactoryBean {
    @Override
    public Object getObject() throws Exception {
        return new DiscountInfo();
    }

    @Override
    public Class<?> getObjectType() {
        return DiscountInfo.class;
    }
}
//此時注意,使用容器擷取bean時,應該使用對應的.class檔案,并且getObjectType()方法傳回的類型必須與上面的getObject()一緻;若想使用名字,應當使用myFactoryBean的名字
//并且對于DiscountInfo這個bean中,注入的bean都不會被注入
//對于FactoryBean接口和SmartFactoryBean接口的差別是:FactoryBean有點懶加載的意思,SmartFactoryBean這個會直接加載           

方式六:直接使用上下文進行注冊

public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
    context.register(DiscountInfo.class);
    DiscountInfo discountInfo = context.getBean(DiscountInfo.class);
    CheckEcloudVo checkEcloudVo = context.getBean("checkEcloudVo", CheckEcloudVo.class);
    System.out.println(discountInfo);
    checkEcloudVo.test();
}           

方式七:使用上下文中的BeanDefinitionBuilder注冊

public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
    AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
    beanDefinition.setBeanClass(DiscountInfo.class);
    context.registerBeanDefinition("discountInfo",beanDefinition );
    DiscountInfo discountInfo = context.getBean(DiscountInfo.class);
    CheckEcloudVo checkEcloudVo = context.getBean("checkEcloudVo", CheckEcloudVo.class);
    System.out.println(discountInfo);
    checkEcloudVo.test();
}           

方式八:使用上下文注冊

public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
    context.registerBean("discountInfo", DiscountInfo.class, new Supplier<DiscountInfo>() {
        @Override
        public DiscountInfo get() {
            return new DiscountInfo();
        }
    });
    DiscountInfo discountInfo = context.getBean(DiscountInfo.class);
    CheckEcloudVo checkEcloudVo = context.getBean("checkEcloudVo", CheckEcloudVo.class);
    System.out.println(discountInfo);
    checkEcloudVo.test();
}           

建立bean的方式還有很多,以上隻是舉例了我知道的幾種,歡迎補充!