Spring Boot Bean裝配
阿新 • • 發佈:2018-12-20
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 {};
}
}