注:該部分內(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);
}
}
注解方式
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);
}
有了該例子相信大家對(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的幾種方式。