spring裝配

不想說話的猴子發表於2020-11-21

spring從一定層面上講是Bean容器,那麼它是怎麼實現Bean的裝配,這塊對於理解springBoot自動裝配有很大幫助。這裡說的裝配,我指的是基於註解/程式碼的方式,畢竟現在開發都是註解先行,至於xml方式就不討論了。

方式

  • 模式註解 @Component 等(Spring2.5+)
  • 配置類 @Configuration@Bean (Spring3.0+)
  • 模組裝配 @EnableXXX@Import (Spring3.1+)

模式註解

使用它在我們日常開發中很常見,@Component@Service、@Repository 等。但是它又個天然的缺陷,只能在我們自己寫的程式碼中,對於jar包中元件,無能為力。

配置類

@Configuration@Bean 方式,這種方式我們在開發中也經常使用,例如配置資料來源,一些中介軟體。但是它也有個天然的缺點,配置一多,類就顯得很臃腫,編碼和修改成本都比價高。

模組裝配

這是個殺手鐗,特別對於需要裝配較多的bean到容器,一般它的套路是:@Enablexxx、@Import 註解來完成。

  • 元註解@EnableBean
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(User.class)
public @interface EnableBean {
}
  • 實體
@Data
public class Order {
    private Integer id;
    private Integer userId;
    private Integer productId;
    private BigDecimal amount;

    public Order() {
        System.out.println("order init ...");
    }
}

@Data
public class User {
    private Integer id;
    private String name;

    public User() {
        System.out.println("user init ...");
    }
}

  • 配置類
@Configuration
@EnableBean
public class Config {

}
  • 啟動容器
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
        String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
        Stream.of(beanDefinitionNames).forEach(System.out::println);
    }
  • 列印的日誌
user init ...
10:38:50.701 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'com.hf.astilt.normal.Orange'
10:38:50.702 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'com.hf.astilt.normal.Order'
order init ...
10:38:50.710 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Found key 'spring.liveBeansView.mbeanDomain' in PropertySource 'systemProperties' with value of type String
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
config
com.hf.astilt.normal.User
com.hf.astilt.normal.Orange
com.hf.astilt.normal.Order

可以看到spring啟動後,列印出了我配置的幾個類,是不是簡單很多。

相關文章