SpringBootApplication注解
SpringBoot程序啟動入口一個是SpringApplication.run,一個是@SpringBootApplication注解,這個注解是由三部分組成:
@ComponentScan注解谜嫉,主要用于組件掃描和自動裝配区匠。
@SpringBootConfiguration注解,這個注解主要是繼承@Configuration注解蚤蔓,主要用于加載配置文件淑廊。
@EnableAutoConfiguration注解,這個注釋啟用了Spring Boot的自動配置功能说榆,可以自動為您配置很多東西锥忿。
源碼
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@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 {};
}
實例
@SpringBootApplication
public class HelloDemo implements CommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(HelloDemo.class);
public static void main(String args[]) {
SpringApplication.run(HelloDemo.class);
}
@Override
public void run(String...args) throws Exception {
log.info("hello 51gjie");
}
}
@SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiguration牛郑,是這三個Spring注釋的組合,只需一行代碼即可提供所有三個注釋的功能缎谷。
Spring ComponentScan注解詳解
Spring中@ComponentScan注解的作用就是根據(jù)定義的掃描路徑井濒,把符合掃描規(guī)則的類裝配到spring的bean容器中。
源碼
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
Class[] basePackageClasses() default {};
Class nameGenerator() default BeanNameGenerator.class;
Class 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 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 {};
}
}
basePackages與value:? 用于指定包的路徑列林,進行掃描
basePackageClasses: 用于指定某個類的包的路徑進行掃描
nameGenerator: bean的名稱的生成器
useDefaultFilters: 是否開啟對@Component瑞你,@Repository,@Service希痴,@Controller的類進行檢測
includeFilters: 包含的過濾條件 FilterType.ANNOTATION:按照注解過濾,FilterType.ASSIGNABLE_TYPE:按照給定的類型,FilterType.ASPECTJ:使用ASPECTJ表達式,FilterType.REGEX:正則,FilterType.CUSTOM:自定義規(guī)則
excludeFilters: 排除的過濾條件者甲,用法和includeFilters一樣
注解方式
- 掃描包
@ComponentScan(basePackages = “”) //單個
@ComponentScan(basePackages = {“xxx”,“aaa”,“…”}) //多個
注意:可以省略“basePackages =”
@Configuration
@ComponentScan("com.51gjie.spring.service")
public class MyConfig {}
@Configuration
@ComponentScan("com.51gjie.spring.dao","com.51gjie.spring.service")
public class MyConfig {}
@Configuration
@ComponentScan("com.51gjie.spring.*") //通配符匹配所有的包
public class MyConfig {}
學(xué)習(xí)目錄
-
搭建
-
原理
-
應(yīng)用
Spring ComponentScan注解詳解
Spring中@ComponentScan注解的作用就是根據(jù)定義的掃描路徑嫩实,把符合掃描規(guī)則的類裝配到spring的bean容器中刽辙。
源碼
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
Class[] basePackageClasses() default {};
Class nameGenerator() default BeanNameGenerator.class;
Class 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 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 {};
}
}
basePackages與value:? 用于指定包的路徑,進行掃描
basePackageClasses: 用于指定某個類的包的路徑進行掃描
nameGenerator: bean的名稱的生成器
useDefaultFilters: 是否開啟對@Component甲献,@Repository宰缤,@Service,@Controller的類進行檢測
includeFilters: 包含的過濾條件 FilterType.ANNOTATION:按照注解過濾,FilterType.ASSIGNABLE_TYPE:按照給定的類型,FilterType.ASPECTJ:使用ASPECTJ表達式,FilterType.REGEX:正則,FilterType.CUSTOM:自定義規(guī)則
excludeFilters: 排除的過濾條件,用法和includeFilters一樣
注解方式
1. 掃描包
@ComponentScan(basePackages = “”) //單個
@ComponentScan(basePackages = {“xxx”慨灭,“aaa”,“…”}) //多個
注意:可以省略“basePackages =”
@Configuration
@ComponentScan("com.51gjie.spring.service")
public class MyConfig {}
@Configuration
@ComponentScan("com.51gjie.spring.dao","com.51gjie.spring.service")
public class MyConfig {}
@Configuration
@ComponentScan("com.51gjie.spring.*") //通配符匹配所有的包
public class MyConfig {}
2. 掃描類
@ComponentScan(basePackageClasses = “”) //單個
@ComponentScan(basePackageClasses = {“aaa”朦乏,“bbb”,“…”}) //多個
注意:不可以省略“basePackageClasses =”
@Configuration
@ComponentScan(basePackageClasses = HelloController.class)
public class MyConfig {
}
總結(jié)
Spring ComponentScan注解有以下特性:
1. 自定掃描路徑下邊帶有@Controller,@Service氧骤,@Repository呻疹,@Component注解加入spring容器
2. 通過includeFilters加入掃描路徑下沒有以上注解的類加入spring容器
3. 通過excludeFilters過濾出不用加入spring容器的類
4. 自定義增加了@Component注解的注解方式
SpringBootConfiguration注解
SpringBootConfiguration是SpringBoot項目的配置注解,這也是一個組合注解筹陵,SpringBootConfiguration注解可以用java代碼的形式實現(xiàn)spring中xml配置文件配置的效果刽锤,并會將當(dāng)前類內(nèi)聲明的一個或多個以@Bean注解標(biāo)記的方法的實例納入到spring容器中,并且實例名就是方法名惶翻。
實例
@SpringBootConfiguration
public class Config {
@Bean
public Map MyMap(){
Map map = new HashMap();
map.put("website","51gjie");
map.put("type","javaschool");
map.put("age",5);
return map;
}
}
@RestController
@SpringBootApplication
public class App
{
public static void main( String[] args )
{
Map map = (Map) context.getBean("MyMap"); //注意這里直接獲取到這個方法bean
int age = (int) map.get("age");
System.out.println("age=="+age);
}
}
SpringBoot項目中推薦使用@SpringBootConfiguration替代@Configuration
EnableAutoConfiguration注解
EnableAutoConfiguration是SpringBoot的一個特性姑蓝,可以根據(jù)classpath中的jar依賴,自動注冊bean,一般用于類或接口上,它嘗試根據(jù)您添加的jar依賴項自動配置Spring應(yīng)用程序吕粗。
源碼
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class[] exclude() default {};
String[] excludeName() default {};
}
@EnableAutoConfiguration實現(xiàn)的關(guān)鍵在于引入了AutoConfigurationImportSelector,其核心邏輯為selectImports方法旭愧,借助AutoConfigurationImportSelector颅筋,它可以幫助SpringBoot應(yīng)用將所有符合條件的@Configuration配置都加載到當(dāng)前SpringBoot創(chuàng)建并使用的IoC容器。
原理
當(dāng)springboot掃描到@EnableAutoConfiguration注解時則會將spring-boot-autoconfigure.jar/META-INF/spring.factories文件中org.springframework.boot.autoconfigure.EnableAutoConfiguration對應(yīng)的value里的所有xxxConfiguration類加載到IOC容器中输枯。spring.factories文件里每一個xxxAutoConfiguration文件一般都會有下面的條件注解:
@ConditionalOnClass : classpath中存在該類時起效
@ConditionalOnMissingClass : classpath中不存在該類時起效
@ConditionalOnBean : DI容器中存在該類型Bean時起效
@ConditionalOnMissingBean : DI容器中不存在該類型Bean時起效
@ConditionalOnSingleCandidate : DI容器中該類型Bean只有一個或@Primary的只有一個時起效
@ConditionalOnExpression : SpEL表達式結(jié)果為true時
@ConditionalOnProperty : 參數(shù)設(shè)置或者值一致時起效
@ConditionalOnResource : 指定的文件存在時起效
@ConditionalOnJndi : 指定的JNDI存在時起效
@ConditionalOnJava : 指定的Java版本存在時起效
@ConditionalOnWebApplication : Web應(yīng)用環(huán)境下起效
@ConditionalOnNotWebApplication : 非Web應(yīng)用環(huán)境下起效
SpringBoot中EnableAutoConfiguration實現(xiàn)的關(guān)鍵在于引入了AutoConfigurationImportSelector议泵,其核心邏輯為selectImports方法,邏輯大致如下:
從配置文件META-INF/spring.factories加載所有可能用到的自動配置類桃熄;
去重先口,并將exclude和excludeName屬性攜帶的類排除;
過濾瞳收,將滿足條件(@Conditional)的自動配置類返回碉京;
SpringBoot注解就是給代碼打上標(biāo)簽的能力。通過引入注解螟深,我們可以簡單快速賦予代碼生命力谐宙,大大提高代碼可讀性和擴展性。注解本身不具有任何能力界弧,只是一個標(biāo)簽凡蜻,但是我們可以定義各種標(biāo)簽然后實現(xiàn)各種標(biāo)簽處理器來對類、方法垢箕、屬性甚至參數(shù)等進行功能擴展划栓、功能開啟、屬性定義条获、行為定義忠荞、規(guī)則定義、關(guān)聯(lián)處理、元數(shù)據(jù)定義等等钻洒。
元注解
@Documented:將會在被此注解注解的元素的javadoc文檔中列出注解奋姿,一般都打上這個注解沒壞處
@Target:注解能被應(yīng)用的目標(biāo)元素,比如類素标、方法称诗、屬性、參數(shù)等等头遭,需要仔細思考
@Retention:僅在源碼保留寓免,還是保留到編譯后的字節(jié)碼,還是到運行時也去加載计维,超過90%的應(yīng)用會在運行時去解析注解進行額外的處理袜香,所以大部分情況我們都會設(shè)置配置為RetentionPolicy.RUNTIME
@Inherited:如果子類沒有定義注解的話,能自動從父類獲取定義了繼承屬性的注解鲫惶,比如Spring的@Service是沒有繼承特性的蜈首,但是@Transactional是有繼承特性的,在OO繼承體系中使用Spring注解的時候請?zhí)貏e注意這點欠母,理所當(dāng)然認為注解是能被子類繼承的話可能會引起不必要的Bug欢策,需要仔細斟酌是否開啟繼承
@Repeatable:Java 8引入的特性,通過關(guān)聯(lián)注解容器定義可重復(fù)注解赏淌,小小語法糖提高了代碼可讀性踩寇,對于元素有多個重復(fù)注解其實是很常見的事情,比如某方法可以是A角色可以訪問也可以是B角色可以訪問六水,某方法需要定時任務(wù)執(zhí)行俺孙,要在A條件執(zhí)行也需要在B條件執(zhí)行
@Native:是否在.h頭文件中生成被標(biāo)記的字段,除非原生程序需要和Java程序交互掷贾,否則很少會用到這個元注解
基本注解
@Service: 注解在類上睛榄,表示這是一個業(yè)務(wù)層bean
@Controller:注解在類上,表示這是一個控制層bean
@Repository: 注解在類上胯盯,表示這是一個數(shù)據(jù)訪問層bean
@Component: 注解在類上懈费,表示通用bean ,value不寫默認就是類名首字母小寫
@Autowired:按類型注入.默認屬性required= true
@Resource: 按名稱裝配博脑。
啟動注解
@SpringBootApplication:包含了@ComponentScan憎乙、@Configuration和@EnableAutoConfiguration注解。其中
@ComponentScan:讓spring Boot掃描到Configuration類并把它加入到程序上下文叉趣。
@SpringBootConfiguration :等同于spring的XML配置文件泞边;使用Java代碼可以檢查類型安全。
@EnableAutoConfiguration :自動配置疗杉。
HTTP注解
@RequestBody:HTTP請求獲取請求體(處理復(fù)雜數(shù)據(jù)阵谚,比如JSON)
@RequestHeader:HTTP請求獲取請求頭
@CookieValue:HTTP請求獲取cookie
@SessionAttribute:HTTP請求獲取會話
@RequestAttribute:HTTP請求獲取請求的Attribute中(比如過濾器和攔截器手動設(shè)置的一些臨時數(shù)據(jù))蚕礼,
@RequestParam:HTTP請求獲取請求參數(shù)(處理簡單數(shù)據(jù),鍵值對)梢什,
@PathVariable:HTTP請求獲取路徑片段奠蹬,
@MatrixAttribute:HTTP請求獲取矩陣變量允許我們采用特殊的規(guī)則在URL路徑后加參數(shù)(分號區(qū)分不同參數(shù),逗號為參數(shù)增加多個值)
其他注解
@Transient:表示該屬性并非一個到數(shù)據(jù)庫表的字段的映射,ORM框架將忽略該屬性嗡午。
@ConfigurationProperties:給對象賦值囤躁,將注解轉(zhuǎn)換成對象。
@RequestMapping:和請求報文是做對應(yīng)的
@EnableCaching:注解驅(qū)動的緩存管理功能
@GeneratedValue:用于標(biāo)注主鍵的生成策略荔睹,通過 strategy 屬性指定
@JsonIgnore:作用是json序列化時將Java bean中的一些屬性忽略掉,序列化和反序列化都受影響狸演。
@JoinColumn(name=”loginId”):一對一:本表中指向另一個表的外鍵。一對多:另一個表指向本表的外鍵僻他。