Spring Boot 注解—常用注解

注:該部分內(nèi)容包含一些常用注解溉苛,如果沒(méi)有學(xué)習(xí)過(guò)java注解的同學(xué)可以先看一下上一小節(jié)的內(nèi)容Spring Boot 注解—基本知識(shí) 澈驼,不看也沒(méi)關(guān)系畏纲,下面就開(kāi)始本節(jié)內(nèi)容。

@Configuration注解

@Configuration注解意思是往容器中加入一個(gè)組件盈厘,該組件的主要作用是進(jìn)行一些配置睁枕,相當(dāng)于之前配置的配置文件,下面我們用兩種方式對(duì)其進(jìn)行演示:
準(zhǔn)備工作
pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.itbofeng</groupId>
    <artifactId>SpringDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

配置文件方式
1沸手、創(chuàng)建類路徑配置文件beans.xml
2外遇、創(chuàng)建User類

package com.itbofeng.bean;
/**
 * 描述:User Bean 用來(lái)測(cè)試
 */
public class User {
    private String name;
    private Integer age;
    public User() {
    }
    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

2、在配置文件中加入U(xiǎn)ser bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user" class="com.itbofeng.bean.User">
        <property name="name" value="zhangsan"></property>
        <property name="age" value="13"></property>
    </bean>
</beans>

3契吉、運(yùn)行測(cè)試

import com.itbofeng.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 描述:測(cè)試類
 */
public class MainConfigTest {
    @Test
    public void testXml(){
        //通過(guò)配置文件創(chuàng)建容器跳仿,需要傳入配置文件
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml");
        //獲取bean
        User user= (User) applicationContext.getBean("user");
        System.out.println(user);
    }
}

運(yùn)行結(jié)果

注解方式
1、創(chuàng)建配置類MainConfig.java
2捐晶、注冊(cè)組件用@Bean注解
我們看一下代碼

package com.itbofeng;

import com.itbofeng.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 描述:該類對(duì)@Configuration注解進(jìn)行講解
 */
@Configuration
public class MainConfig {
    /**
     * 給容器中加入Bean菲语,相當(dāng)于配置文件總的bena標(biāo)簽
     * id 默認(rèn)是方法名稱,也可以指定id
     * class 即返回值類型
     */
    @Bean
    public User user(){
        return new User("lisi",18);
    }
}

以上配置類就等同于beans.xml中的內(nèi)容
3惑灵、運(yùn)行測(cè)試

    @Test
    public void testAnnoation(){
        //通過(guò)注解創(chuàng)建容器山上,需要傳入配置類
        ApplicationContext applicationContext=new AnnotationConfigApplicationContext(MainConfig.class);
        //獲取bean
        User user= (User) applicationContext.getBean("user");
        System.out.println(user);
    }
運(yùn)行結(jié)果

有了該例子相信大家對(duì)@Configuration有了一個(gè)基本的認(rèn)識(shí),其就相當(dāng)于Spring配置文件的功能英支,不過(guò)是以注解的方式進(jìn)行體現(xiàn)佩憾,之前我們?cè)谂渲梦募卸嗖捎冒鼟呙璧姆绞竭M(jìn)行,那么這種方式在配置類中如何體現(xiàn)呢,下面我們引入第二個(gè)注解@ComponentScan包掃描注解

@ComponentScan注解

@ComponentScan注解就相當(dāng)于 xml配置文件中的context:component-scan標(biāo)簽妄帘,下面講解一下他的基本使用方法:
xml

<context:component-scan base-package="com.itbofeng"></context:component-scan>

java

@Configuration
@ComponentScan("com.itbofeng")
public class MainConfig {
  //...
}

這樣就可以對(duì)com.itbofeng包下的@Controller楞黄、@Service、@Component抡驼、@Respoitory鬼廓、@Component標(biāo)注的類進(jìn)行掃描,并由Spring容器進(jìn)行管理致盟,當(dāng)然spring并不是這么簡(jiǎn)單的桑阶,它還可以進(jìn)行排除,僅包含勾邦,我們看一下xml和java的語(yǔ)法
xml

    <!--包掃描、如果想要include-filter起作用需要設(shè)置use-default-filters="false",禁用默認(rèn)過(guò)濾規(guī)則-->
    <context:component-scan base-package="com.itbofeng" use-default-filters="false">
        <!--排除-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
        <!--僅包括-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"></context:include-filter>
    </context:component-scan>

java

@Configuration
@ComponentScan(value = "com.itbofeng",excludeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
},
includeFilters = {
        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class})
},useDefaultFilters = false)
public class MainConfig {
  //...
}

對(duì)于jdk1.8及以上@ComponentScan支持重復(fù)注解割择,另外還有@ComponentScans注解可以寫(xiě)多個(gè)@ComponentScan注解眷篇,另外需要說(shuō)明的兩種過(guò)濾方式排除和僅包含在一個(gè)包掃描中僅可出現(xiàn)一個(gè)。
關(guān)于@ComponentScan.Filter.type的取值大家可以參考:https://www.cnblogs.com/kevin-yuan/p/5068448.html
我們之前看到過(guò)@Bean注解荔泳,但并未對(duì)該注解進(jìn)行詳細(xì)介紹
@Bean
前面我們初步體驗(yàn)了一下@bean注解的作用也很簡(jiǎn)單常用來(lái)標(biāo)注在方法上面蕉饼,來(lái)表示往spring容器中添加一個(gè)組件如上面的利用@Bean往容器中添加一個(gè)User組件,在xml中我們不僅能夠往容器中添加一個(gè)bean而且還能設(shè)置lazy-init玛歌、scope的屬性昧港,這些屬性在注解里面可以這樣使用

    @Lazy
    @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
    @Bean
    public User user(){
        return new User("lisi",18);
    }

等同于

<bean id="user" class="com.itbofeng.bean.User" scope="singleton" lazy-init="true">
        <property name="name" value="zhangsan"></property>
        <property name="age" value="13"></property>
</bean>

@Component、@Configuration支子、@Controller创肥、@Service、@Repository
其實(shí)在web開(kāi)發(fā)中我們最常用的組件是@Component值朋、@Configuration叹侄、@Controller、@Service昨登、@Repository這幾個(gè)注解都有一個(gè)作用趾代,往容器中添加一個(gè)組件他們都是@Component組合注解,他們標(biāo)注在類上面丰辣,表示往spring容器中添加一個(gè)組件撒强,@Controller用來(lái)標(biāo)注在Controller上面,@Service用來(lái)標(biāo)注Service層上面笙什,@Repository用來(lái)標(biāo)注在持久層上面飘哨,@Configuration用來(lái)標(biāo)注在配置類上,@Component用來(lái)標(biāo)注在其他組件上面得湘。
@RequestMapping
在SpringMVC中還有個(gè)重要的注解@RequestMapping杖玲,它是用來(lái)做地址映射的,就是說(shuō)淘正,我們一個(gè)請(qǐng)求摆马,該如何映射到我們的方法上面臼闻。它可用于類或方法上,用于類上囤采,表示類中的所有響應(yīng)請(qǐng)求的方法都是以該地址作為父路徑述呐。RequestMapping注解有六個(gè)屬性,其中常用的有value蕉毯, method乓搬、非常用的有params,headers代虾、consumes进肯,produces,value:指定請(qǐng)求的實(shí)際地址棉磨,method: 指定請(qǐng)求的method類型江掩, GET、POST乘瓤、PUT环形、DELETE等(符合Rest風(fēng)格);params: 指定request中必須包含某些參數(shù)值是衙傀,才讓該方法處理抬吟。headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請(qǐng)求统抬。consumes: 指定處理請(qǐng)求的提交內(nèi)容類型(Content-Type)火本,例如application/json, text/html;produces: 指定返回的內(nèi)容類型,僅當(dāng)request請(qǐng)求頭中的(Accept)類型中包含該指定類型才返回聪建,例子:

package com.itbofeng.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class UserController {
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String hello(){
        return "hello";
    }
}

@ResponseBody
如果我們配置了視圖解析器ViewResolver发侵,如果我們?cè)L問(wèn) localhost:8080/hello還并不能夠返回hello,其會(huì)返回視圖解析器的前綴+hello+后綴的頁(yè)面妆偏,如果我們想要其向?yàn)g覽器返回hello內(nèi)容刃鳄,則需要@ResponseBody注解,該注解就是將返回值直接返回給瀏覽器钱骂,如果返回值是一個(gè)對(duì)象叔锐,則會(huì)返回該對(duì)象的json對(duì)象,其可以標(biāo)注在方法上表示該方法返回遵守該規(guī)則见秽,也可以標(biāo)注在類上愉烙,表示該類下的所有方法都遵守該規(guī)則。用法如下:

    @ResponseBody
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String hello(){
        return "hello";
    }

@RestController
@RestController=@Controller+@ResponseBody
@PathVariable解取、@RequestParam
@PathVariable 路徑變量步责,主要是將路徑中的值映射為變量(Rest編程風(fēng)格推薦),
@RequestParam 請(qǐng)求參數(shù),主要是獲取請(qǐng)求中的參數(shù)
下面我們舉例說(shuō)明:
地址① http://localhost:8080/hello?name=lisi
地址② http://localhost:8080/hello/lisi
我們通過(guò)兩種方式來(lái)獲取變量請(qǐng)求中的lisi蔓肯,
@RequestParam 方式

    @ResponseBody
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String hello(@RequestParam("name") String name){
        return "hello "+name;
    }

@PathVariable 方式

    @ResponseBody
    @RequestMapping(value = "/hello/{name}",method = RequestMethod.GET)
    public String hello(@PathVariable("name") String name){
        return "hello "+name;
    }

注意:請(qǐng)求路徑的變化
今天注解部分就先將到這里遂鹊,后面我們?cè)趯W(xué)習(xí)過(guò)程中學(xué)到什么,再具體講解其用法蔗包,關(guān)于這些注解的在什么時(shí)候起作用的呢秉扑,需要我們學(xué)習(xí)了Spring的運(yùn)行流程之后,才能進(jìn)一步的進(jìn)行深入了解调限,下一節(jié)舟陆,我們學(xué)習(xí)一下往容器中添加Bean的幾種方式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耻矮,一起剝皮案震驚了整個(gè)濱河市秦躯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裆装,老刑警劉巖宦赠,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異米母,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)毡琉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)铁瞒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人桅滋,你說(shuō)我怎么就攤上這事慧耍。” “怎么了丐谋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵芍碧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我号俐,道長(zhǎng)泌豆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任吏饿,我火速辦了婚禮踪危,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猪落。我一直安慰自己贞远,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布笨忌。 她就那樣靜靜地躺著蓝仲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袱结,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天亮隙,我揣著相機(jī)與錄音,去河邊找鬼擎勘。 笑死咱揍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棚饵。 我是一名探鬼主播煤裙,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼噪漾!你這毒婦竟也來(lái)了硼砰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤欣硼,失蹤者是張志新(化名)和其女友劉穎题翰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诈胜,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豹障,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了焦匈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片血公。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缓熟,靈堂內(nèi)的尸體忽然破棺而出累魔,到底是詐尸還是另有隱情,我是刑警寧澤够滑,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布垦写,位于F島的核電站,受9級(jí)特大地震影響彰触,放射性物質(zhì)發(fā)生泄漏梯投。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一况毅、第九天 我趴在偏房一處隱蔽的房頂上張望晚伙。 院中可真熱鬧,春花似錦俭茧、人聲如沸咆疗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)午磁。三九已至尝抖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迅皇,已是汗流浹背昧辽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留登颓,地道東北人搅荞。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像框咙,于是被迫代替她去往敵國(guó)和親咕痛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理喇嘱,服務(wù)發(fā)現(xiàn)茉贡,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • 1.1 Spring IoC容器和bean簡(jiǎn)介 本章介紹了Spring Framework實(shí)現(xiàn)的控制反轉(zhuǎn)(IoC)...
    起名真是難閱讀 2,567評(píng)論 0 8
  • 1.1 spring IoC容器和beans的簡(jiǎn)介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器者铜,...
    simoscode閱讀 6,701評(píng)論 2 22
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架腔丧,建立于...
    Hsinwong閱讀 22,313評(píng)論 1 92