springboot

18.6.15springboot中關(guān)于Bean的注解
本節(jié)介紹注解:
@Component
@Service
@Scope
@Repository
@Controller
@RestController
@RequestMapping
@PathVariable
@ResponseBody
如何吸引Spring容器的注意而“有幸”成為Spring 容器管理的Bean呢狡相?
在Spring Boot中就依靠注解梯皿。Spring提供了多個(gè)注解來(lái)聲明Bean為Spring容器管理的Bean风钻,注解不同代表的含義不同进泼,但是對(duì)Spring容器來(lái)說(shuō)都是Spring管理的Bean母谎。
Spring IoC(ApplicationContext)容器負(fù)責(zé)進(jìn)行掃描Bean亡电,進(jìn)行Bean的初始化某筐、配置和依賴(lài)管理雹嗦。
聲明Bean的注解有:
@Component 沒(méi)有明確角色的組件
@Service 在業(yè)務(wù)邏輯層(Service層)使用
@Repositpry 在數(shù)據(jù)訪(fǎng)問(wèn)層(dao層)使用
@Controller 用于標(biāo)注控制層組件
@RestController
1、@Component注解
/**

  • @since 2.5
  • @see Repository
  • @see Service
  • @see Controller
  • @see org.springframework.context.annotation.ClassPathBeanDefinitionScanner // 掃描包中Bean仔拟,注冊(cè)
    */
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Indexed
    public @interface Component {
    // 如果有返回組件名稱(chēng),否則返回空字符串
    String value() default "";
    }
    @Component注解作用域默認(rèn)為singleton
    @Component使用在不確定哪一個(gè)層的時(shí)候使用飒赃,可以作用在任何層次利花,把普通pojo實(shí)例化到spring容器
    不推薦使用@Component注解,而應(yīng)該使用它的擴(kuò)展载佳,如@Service炒事、@Repository
    2、@Service注解
  • @see Component
  • @see Repository
    */
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    public @interface Service {
    @AliasFor(annotation = Component.class)
    String value() default "";
    }
    @Service是@Component注解的一個(gè)特例蔫慧,作用在類(lèi)上
    @Service注解作用域默認(rèn)為singleton
    使用注解配置和類(lèi)路徑掃描時(shí)挠乳,被@Service注解標(biāo)注的類(lèi)會(huì)被Spring掃描并注冊(cè)為Bean
    @Service用于標(biāo)注業(yè)務(wù)層組件,表示定義一個(gè)bean
    @Service使用時(shí)沒(méi)有傳參數(shù),Bean名稱(chēng)默認(rèn)為當(dāng)前類(lèi)的類(lèi)名,首字母小寫(xiě)
    @Service(“serviceBeanId”)或@Service(value=”serviceBeanId”)使用時(shí)傳參數(shù)睡扬,使用value作為Bean名字
    3盟蚣、@Scope注解
    @Scope有5種取值:
    基本作用域:
    org.springframework.beans.factory.config.ConfigurableBeanFactory.SCOPE_SINGLETON = "singleton"
    Spring 容器中有且只有一個(gè)Bean實(shí)例,只要Spring容器不銷(xiāo)毀或退出卖怜,該Bean實(shí)例就會(huì)一直存活
    org.springframework.beans.factory.config.ConfigurableBeanFactory.SCOPE_PROTOTYPE = "prototype"
    每次獲取Bean的時(shí)候會(huì)有一個(gè)新的實(shí)例屎开,Spring容器不能對(duì)返回Bean實(shí)例的整個(gè)生命周期負(fù)責(zé)
    Web作用域:
    org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST = "request"
    request只適用于Web程序,每一次HTTP請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的bean马靠,同時(shí)該bean僅在當(dāng)前HTTP request內(nèi)有效奄抽,當(dāng)請(qǐng)求結(jié)束后,該對(duì)象的生命周期即告結(jié)束
    org.springframework.web.context.WebApplicationContext#SCOPE_SESSION = "session"
    session只適用于Web程序甩鳄,session作用域表示該針對(duì)每一次HTTP請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的bean逞度,同時(shí)該bean僅在當(dāng)前HTTP session內(nèi)有效
    org.springframework.web.context.WebApplicationContext#SCOPE_APPLICATION = "application"
    application只適用于Web程序,全局作用域

@Scope作用在類(lèi)上和方法上
@Scope用來(lái)配置 spring bean 的作用域妙啃,它標(biāo)識(shí) bean 的作用域
例如:
// 單例
@Service
@Scope("singleton")
public class SingletonScope {
public SingletonScope() {
}
}
//原型
@Service
@Scope("prototype")
public class PrototypeScope {
public PrototypeScope() {
}
}
4档泽、@Repository注解

  • @see Component
  • @see Service
  • @see org.springframework.dao.DataAccessException
  • @see org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor
    */
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    public @interface Repository {
    @AliasFor(annotation = Component.class)
    String value() default "";
    }
    @Repository注解默認(rèn)作用域?yàn)閟inglton,單例
    @Repository與@Scope注解一起使用可以修改Bean的作用域
    5彬祖、@Controller注解
  • @see Component
  • @see org.springframework.web.bind.annotation.RequestMapping
  • @see org.springframework.context.annotation.ClassPathBeanDefinitionScanner
    */
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    public @interface Controller {
    @AliasFor(annotation = Component.class)
    String value() default "";
    }
    @Controller注解作用在類(lèi)上
    使用注解配置和類(lèi)路徑掃描時(shí)茁瘦,被@Controller注解標(biāo)注的類(lèi)會(huì)被Spring掃描并注冊(cè)為Bean
    @Controller用于標(biāo)注Web中控制層組件
    被@Controller標(biāo)注的類(lèi)負(fù)責(zé)處理由DispatcherServlet分發(fā)的請(qǐng)求,它把用戶(hù)請(qǐng)求的數(shù)據(jù)經(jīng)過(guò)業(yè)務(wù)處理層處理之后封裝成一個(gè)Model 储笑,然后再把該Model返回給對(duì)應(yīng)的View進(jìn)行展示
    @Controller和@RequestMapping甜熔、@RequestParam等一些注解共同處理URL的映射
    6、@RequestMapping注解
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Mapping
    public @interface RequestMapping {
    String name() default "";
    @AliasFor("path")
    String[] value() default {};
    @AliasFor("value")
    String[] path() default {};
    RequestMethod[] method() default {};
    String[] params() default {};
    String[] headers() default {};
    String[] consumes() default {};
    String[] produces() default {};
    }
    @RequestMapping注解作用在類(lèi)或方法上
    @RequestMapping注解用來(lái)處理請(qǐng)求地址映射
    @RequestMapping注解有7個(gè)屬性
    value和path參數(shù)method參數(shù) consumes參數(shù)produces參數(shù)params參數(shù)headers參數(shù)

@RequestMapping請(qǐng)求路徑匹配
符號(hào) * 匹配任一字符
符號(hào) ** 匹配任意路徑
符號(hào) 突倍? 匹配單個(gè)字符
如果一個(gè)請(qǐng)求有多個(gè)@Requestmapping能夠匹配腔稀,通過(guò)匹配更具體的方法處理此請(qǐng)求
@RequestMapping注解標(biāo)注的方法可以接受多種類(lèi)型的參數(shù):
詳細(xì)參考書(shū)籍:Spring Boot精髓 從構(gòu)建小系統(tǒng)到架構(gòu)分布式大系統(tǒng)
@PathVariable - 將URL中的值映射到方法參數(shù)中
Model - Spring MVC中通用的模型
ModelAndView - 包含了模型和視圖路徑的對(duì)象
JavaBean - 將HTTP參數(shù)映射到JavaBean對(duì)象
MultipartFile - 用于處理文件上傳
@ModelAttribute - 用于將該注解的變量作為Model的一個(gè)屬性

7、@ResponseBody注解
@ResponseBody注解支持將返回值放在response體內(nèi)羽历,而不是返回一個(gè)視圖
@ResponseBody注解直接將返回的對(duì)象輸出到客戶(hù)端
如果返回字符串焊虏,直接返回
如果返回不是字符串,默認(rèn)使用Jackson將對(duì)象序列化成JSON字符串后輸出
8秕磷、@RestController注解/這個(gè)挺酷的诵闭。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(annotation = Controller.class)
String value() default "";
}
@RestController是一個(gè)組合注解
@RestController = @Controller + @ResponseBody
@RestController注解直接將返回的對(duì)象輸出到客戶(hù)端
如果返回字符串,直接返回
如果返回不是字符串澎嚣,默認(rèn)使用Jackson將對(duì)象序列化成JSON字符串后輸出

參考:https://blog.csdn.net/lipinganq/article/details/79155072
——————————————————————
18.6.14
springboot自帶tomcat疏尿,因此無(wú)需配置自己的tomcat,如果想使用自己的tomcat易桃,需要增加<scope>provided</scope>標(biāo)簽褥琐,含義是告訴springboot我已經(jīng)提供了。
如果沒(méi)有提供tomcat晤郑,想要使用springboot自帶的tomcat敌呈,需要把provided注釋贸宏。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
——————————————————————
17.12.22
idea新建springboot項(xiàng)目有一個(gè)默認(rèn)目錄,頁(yè)面文件不在放在傳統(tǒng)的webapp頁(yè)面中磕洪。
資源文件夾下static文件夾用來(lái)存放web程序的靜態(tài)資源吭练,例如圖片、css褐鸥、js等线脚。
template文件夾存放web程序的視圖模板,html等需要渲染的模板文件就放在這里叫榕。
application.properties文件很重要浑侥,它是Spring Boot項(xiàng)目的全局配置文件。
Spring Boot項(xiàng)目更喜歡Java配置方式晰绎。因此從這里開(kāi)始寓落,所有的Spring配置都是用Java方式配置。

——————————————————————
17.12初
最近在研究springboot荞下。有一本Spring Boot實(shí)戰(zhàn) ,丁雪豐 (譯者) .pdf伶选。主要部分看了一遍。
學(xué)習(xí)了一下“自動(dòng)配置”和“啟動(dòng)依賴(lài)”尖昏。
具體的以后講仰税。
然后在網(wǎng)上找了idea搭建springboot的基礎(chǔ)教程,搭建自己的springboot抽诉。
教程很多陨簇,但是很多照著做自己實(shí)現(xiàn)的時(shí)候就是不行,現(xiàn)實(shí)就是這么有意思迹淌。
然后通過(guò)報(bào)錯(cuò)或者log滿(mǎn)滿(mǎn)排查研究河绽。遇到的問(wèn)題都寫(xiě)在這里。

1唉窃、所有教程都有一個(gè)helloword耙饰,以下是我的。
@RestController
public class HelloController {

@RequestMapping("/hello")
public String say(){
    return "Hello beauty!";
}

}

然后run或debug后跑起來(lái)直接關(guān)閉了纹份,并沒(méi)有在后臺(tái)運(yùn)行苟跪。
解決:pom文件中tomcat依賴(lài),把<scope>provided</scope>蔓涧。注釋了就可以跑起來(lái)測(cè)試了削咆。

  • provided,類(lèi)似compile蠢笋,期望JDK、容器或使用者會(huì)提供這個(gè)依賴(lài)鳞陨。如servlet.jar昨寞。
    解析:provided的意思是只在編譯和測(cè)試階段可用這個(gè)包瞻惋。但是在實(shí)際發(fā)布階段則忽略這個(gè)包。
    使用provided的原因是在編譯和測(cè)試的時(shí)候使用tomcat提供的包援岩,但是將war部署的服務(wù)器上的web服務(wù)器容器中歼狼,就會(huì)發(fā)生內(nèi)嵌的tomcat包和web服務(wù)器提供的包沖突。所以在編譯打包成war部署之前要添加provided享怀,這樣就能防止包的沖突羽峰。
    而如果是自己本地啟動(dòng),并且沒(méi)有配置額外的tomcat添瓷,使用內(nèi)嵌的tomcat啟動(dòng)梅屉,則需要將provided注釋。

——————————————————

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鳞贷,一起剝皮案震驚了整個(gè)濱河市坯汤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搀愧,老刑警劉巖惰聂,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異咱筛,居然都是意外死亡搓幌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)迅箩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)溉愁,“玉大人,你說(shuō)我怎么就攤上這事沙热〔嬖浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵篙贸,是天一觀(guān)的道長(zhǎng)投队。 經(jīng)常有香客問(wèn)我,道長(zhǎng)爵川,這世上最難降的妖魔是什么敷鸦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮寝贡,結(jié)果婚禮上扒披,老公的妹妹穿的比我還像新娘。我一直安慰自己圃泡,他們只是感情好碟案,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著颇蜡,像睡著了一般价说。 火紅的嫁衣襯著肌膚如雪辆亏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天鳖目,我揣著相機(jī)與錄音扮叨,去河邊找鬼。 笑死领迈,一個(gè)胖子當(dāng)著我的面吹牛彻磁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狸捅,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼衷蜓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了薪贫?” 一聲冷哼從身側(cè)響起恍箭,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞧省,沒(méi)想到半個(gè)月后扯夭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鞍匾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年交洗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橡淑。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡构拳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梁棠,到底是詐尸還是另有隱情置森,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布符糊,位于F島的核電站凫海,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏男娄。R本人自食惡果不足惜行贪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望模闲。 院中可真熱鬧建瘫,春花似錦、人聲如沸尸折。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)实夹。三九已至橄浓,卻和暖如春晾咪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贮配。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留塞赂,地道東北人泪勒。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宴猾,于是被迫代替她去往敵國(guó)和親圆存。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容