1. 程式人生 > >Spring Boot Bean裝配

Spring Boot Bean裝配

Spring IOC:管理Spring Bean的容器,有兩個基本功能:

  • 通過描述管理Bean,包括髮布和獲取Bean
  • 通過描述完成Bean之間的依賴關係

Spring Boot主要通過註解將Bean裝配到IOC容器,而不是之前的XML。 下面記錄Bean裝配用到的註解

@Bean

將方法返回的物件裝配到IOC容器中

@Bean(name="dataSource")// name為IOC容器中該Bean名稱,若不指定,則用方法名作為Bean名稱
public DataSource getDataSource(){
	DataSource dataSource = null;
	...
	return
dataSource; }

掃描裝配

Spring 允許通過掃描將Bean裝配到IOC容器,掃描使用的註解是@Component、@ComponentScan

  • @Component:標明該類會被Spring IOC容器掃描裝配
  • @Component:指定掃描裝配Bean的策略

@Component

User類會被Spring IOC容器掃描裝配,這只是一個資源定位的過程,只是儲存Bean定義資訊,還沒有進行Bean初始化

@Component("user")// value="user"指定Bean名稱,若不知定,以首字母小寫的類名作為Bean名稱
public class User{
	private
String name; private int age; }

【注】 常用的@RestController、@Service等註解都注入了@Component,因此被這些註解標記的類都會被掃描裝配到IOC容器。

@ComponentScan

被@ComponentScan標記的類會去指定的掃描路徑下查詢帶有@Component註解的類,裝配到IOC 以Spring Boot啟動類上@SpringBootApplication為例

/** 只掃描啟動類所在包及其子包下的類 **/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration // 自定義排除的掃描Bean @ComponentScan( excludeFilters = { @Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication { // 通過型別排除自動配置類 @AliasFor(annotation = EnableAutoConfiguration.class) Class<?>[] exclude() default {}; // 通過名稱排除自動配置類 @AliasFor(annotation = EnableAutoConfiguration.class) String[] excludeName() default {}; // 定義掃描包 @AliasFor(annotation = ComponentScan.class, attribute = "basePackages") String[] scanBasePackages() default {}; // 定義被掃描的類 @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses") Class<?>[] scanBasePackageClasses() default {}; }
/*不指定掃描包路徑時只掃描標記類所在的包及其子包*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
// 在一個類中可重複定義
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
	// 定義掃描的包 @ComponentScan(basePackages = {"com.springboot.example"})
    @AliasFor("basePackages")
    String[] value() default {};
	// 定義掃描的包  @ComponentScan("com.springboot.example")
    @AliasFor("value")
    String[] basePackages() default {};
	// 定義掃描的類 @ComponentScan(basePackageClasses = {User.class})
    Class<?>[] basePackageClasses() default {};
	// Bean name生成器
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
	
    Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;
	// 作用域代理模式
    ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
	// 資源匹配模式
    String resourcePattern() default "**/*.class";
	// 是否啟用預設的過濾器
    boolean useDefaultFilters() default true;
	/* 當滿足過濾器的條件時掃描*/
    ComponentScan.Filter[] includeFilters() default {};
	/* 當不滿足過濾器的條件時掃描*/
    ComponentScan.Filter[] excludeFilters() default {};
	/* 是否延遲初始化 boolean型別*/
    boolean lazyInit() default false;

    @Retention(RetentionPolicy.RUNTIME)
    @Target({})
    public @interface Filter {
        FilterType type() default FilterType.ANNOTATION;

        @AliasFor("classes")
        Class<?>[] value() default {};

        @AliasFor("value")
        Class<?>[] classes() default {};

        String[] pattern() default {};
    }
}