Spring註解

Spring

1.@service

@Service對應的是業務層Bean,在spring配置文件裏配置bean差不多的功能,就是讓spring自動掃描管理組件例如:

1 @Service("userService")
2 public class UserServiceImpl implements UserService {
3 ………
4 }

@Service("userService")對應控制層中的@Resource,name可有可無



1 // 注入userService
2 @Resource(name = "userService")
3 private UserService userService;

使用此註解需要在spring配置文件里加上這個<context:component-scan base-package=""/>

注意:如果沒有Spring,那麼當Action需要使用UserServiceImpl時,必須通過“UserService userService = new UserServiceImpl();”主動去創建實例對象,但使用了Spring之後,只需要加入註解@Resource,不需要創建對象,只依靠spring來自動實例化對象,這就是所謂的“依賴注入”。

2.@Resource

@Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource默認按 byName自動注入罷了。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。
  @Resource裝配順序
  1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常
  2. 如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常
  3. 如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常
  4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退爲一個原始類型進行匹配,如果匹配則自動裝配;

3、@ Repository

@Repository對應數據訪問層Bean ,例如:

1 @Repository(value="userDao")
2 public class UserDaoImpl extends BaseDaoImpl<User> {
3 ………
4 }

@Repository(value="userDao")註解是告訴Spring,讓Spring創建一個名字叫“userDao”的UserDaoImpl實例。

當Service需要使用Spring創建的名字叫“userDao”的UserDaoImpl實例時,就可以使用@Resource(name = "userDao")註解告訴Spring,Spring把創建好的userDao注入給Service即可。

1 // 注入userDao,從數據庫中根據用戶Id取出指定用戶時需要用到
2 @Resource(name = "userDao")
3 private BaseDao<User> userDao;

4.@RequestMapping

使用 @RequestMapping 來映射請求,也就是通過它來指定控制器可以處理哪些URL請求,@RequestMapping可以作用在類上,也可以在方法上

@RequestMapping 中的 value 和 path 屬性(這兩個屬性作用相同,可以互換,如果僅有這一個屬性,則可以省略,下面兩個例子均採用省略的方式)

1)將 @RequestMapping 註解在 login 方法上,而UserController上不添加 @RequestMapping 註解,這時的請求 URL 是相對於 Web 根目錄

?
1
2
3
4
5
6
7
8
@Controller
public class UserController {
 
    @RequestMapping("/login")
    public String login() {
        return "success";
    }
}

這時的方法 login() 能處理的 URL 請求路徑是基於 Web 應用的,也就是 http://localhost/項目名/login,而在jsp 頁面中的 User Login 鏈接地址應該是:

<a href="login">User Login</a>

?
1
<a href="login">User Login</a>

2)將 @RequestMapping 註解在 UserController 類上,這時類的註解是相對於 Web 根目錄,而方法上的是相對於類上的路徑

?
1
2
3
4
5
6
7
8
9
@Controller
@RequestMapping("/user")
public class UserController {
 
    @RequestMapping("/login")
    public String login() {
        return "success";
    }
}

這時的方法login()能處理的 URL 請求路徑則是 http://localhost/項目名/user/login,在jsp 頁面中的 User Login 鏈接地址應該是:

?
1
<a href="user/login">User Login</a>

 @RequestMapping 的 其他 屬性

 method 屬性

測試 @RequestMapping 的 method 屬性

1)簡介:@RequestMapping 中的 method 主要用來定義接收瀏覽器發來的何種請求。在Spring中,使用枚舉類

org.springframework.web.bind.annotation.RequestMethod來定義瀏覽器請求的方式。

Http規範定義了多種請求資源的方式,最基本的有四種,分別爲:GET(查)、POST(增)、PUT(改)、DELETE(刪),而URL則用於定位網絡上的資源相當於地址的作用,配合四種請求方式,可以實現對URL對應的資源的增刪改查操作。

在實際應用中,很多人並沒有按照這個規範做,因爲使用GET/POST同樣可以完成PUT和DELETE操作,甚至GET也可以完成POST操作,因爲GET不需要用到form表單,而POST卻需要通過表單來發送。

2)通過 @RequestMapping(value="/login",method=RequestMethod.GET) 來指定 login()方法 僅處理通過 GET 方式發來的請求

?
1
2
3
4
5
6
7
8
9
@Controller
@RequestMapping(path = "/user")
public class UserController {
 
    @RequestMapping(path = "/login", method=RequestMethod.GET)
    public String login() {
        return "success";
    }
}

這時,如果瀏覽器發來的請求不是GET的話,將收到瀏覽器返回的錯誤提示,也就是得通過鏈接的方式而不是表單的方式:

?
1
<a href="user/login>User Login</a>

3)通過 @RequestMapping(value="/login",method=RequestMethod.POST) 來指定 login()方法 僅處理通過 POST 方式發來的請求

?
1
2
3
4
5
6
7
8
9
@Controller
@RequestMapping(path = "/user")
public class UserController {
 
    @RequestMapping(path = "/login", method=RequestMethod.POST)
    public String login() {
        return "success";
    }
}

這時,必須通過表單的方式發送請求,否則將收到瀏覽器返回的錯誤提示

?
1
2
3
<form action="user/login" method="post">
    <input type="submit" value="使用Post發送請求"/>
</form>

4)由於在 RequestMapping 註解類中 method() 方法返回的是 RequestMethod 數組,所以可以給 method 同時指定多個請求方式,例如:

?
1
2
3
4
5
6
7
8
9
@Controller
@RequestMapping(path = "/user")
public class UserController {
        // 該方法將同時接收通過GET和POST方式發來的請求
    @RequestMapping(path = "/login", method={RequestMethod.POST,RequestMethod.GET})
    public String login() {
        return "success";
    }
}

 

params 屬性

該屬性表示請求參數,也就是追加在URL上的鍵值對,多個請求參數以&隔開,例如:

1
http://localhost/SpringMVC/user/login?username=kolbe&password=123456
?
1
http://localhost/SpringMVC/user/login?username=kolbe&password=123456

則這個請求的參數爲username=kolbe以及password=123456,@RequestMapping 中可以使用 params 來限制請求參數,來實現進一步的過濾請求,舉個例子:

?
1
2
3
4
5
6
7
8
9
10
@Controller
@RequestMapping(path = "/user")
public class UserController {
         
        // 該方法將接收 /user/login 發來的請求,且請求參數必須爲 username=kolbe&password=123456
    @RequestMapping(path = "/login", params={"username=kolbe","password=123456"})
    public String login() {
        return "success";
    }
}

該例中則表示 UserController 中的 login() 方法僅處理 /user/login 發來的請求,且必須帶有 username=kolbe&password=123456 的請求參數,否則瀏覽器將返回HTTP 404的錯誤, 對應的jsp 中的鍵接地址爲:

1
<a href="user/login?username=kolbe&password=123456">User Login</a>

?
1
<a href="user/login?username=kolbe&password=123456">User Login</a>

 

headers 屬性

該屬性表示請求頭

用於HTTP協義交互的信息被稱爲HTTP報文,客戶端發送的HTTP報文被稱爲請求報文,服務器發回給客戶端的HTTP報文稱爲響應報文,報文由報文頭部和報文體組成。

請求頭部(Request Headers):請求頭包含許多有關客戶端環境和請求正文的信息,例如瀏覽器支持的語言、請求的服務器地址、客戶端的操作系統等。

響應頭部(Rsponse Headers):響應頭也包含許多有用的信息,包括服務器類型、日期、響應內容的類型及編碼,響應內容的長度等等。

如果你安裝的是Chrome瀏覽器,可以通過在網頁中  右擊鼠標---->審查元素---->Network---->Name中點擊網頁---->右側查看Headers即可,如果Name中沒有出現網頁,可以刷新一下即可,下邊是我電腦中的一個請求頭部示例:

?
1
2
3
4
5
6
7
8
9
10
Request Headers
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding:gzip, deflate, sdch
    Accept-Language:zh-CN,zh;q=0.8
    Cache-Control:max-age=0
    Connection:keep-alive
    Cookie:JSESSIONID=210075B5E521CWE3CDE938076295A57A
    Host:localhost:8080
    Upgrade-Insecure-Requests:1
    User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93

回規正題,通過 @RequestMapping 中的 headers 屬性,可以限制客戶端發來的請求

?
1
2
3
4
5
6
7
8
9
@Controller
@RequestMapping(path = "/user")
public class UserController {
        // 表示只接收本機發來的請求
    @RequestMapping(path = "/login", headers="Host=localhost:8080")
    public String login() {
        return "success";
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章