SpringBoot常用注解使用


1.RequestBody和ResponseBody注解

@RequestMapping(“url”),這里的 url寫的是請求路徑的一部分,一般作用在 Controller的方法上,作為請求的映射地址。

代碼:

@RequestMapping(value = "/test")//類級別映射,可以沒有,一般用於減少書寫量
public class myController {

    //方法級別映射,必須有,那么這個方法的訪問地址就是/test/aaa,請求到的頁面就是test.jsp【當然,這里的.jsp需要在配置文件中配置】
    @RequestMapping(value = "/aaa")
    public String getMyName() {
        return "test";
    }
}

那么 @ResponseBody呢?

@ResponseBody是作用在方法上的,@ResponseBody 表示該方法的返回結果直接寫入 HTTP response body 中,一般在異步獲取數據時使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析為跳轉路徑,但是加上 @ResponseBody 后返回結果不會被解析為跳轉路徑,而是直接寫入 HTTP response body 中。 比如異步獲取 json 數據,加上 @ResponseBody 后,會直接返回 json 數據。@RequestBody 將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個對象。

舉個例子:

前台異步請求:

function loginAction() {

    // 獲取用戶輸入的賬號和密碼
    var name = $('#count').val();
    var password = $('#password').val();

    $.ajax({
        url : 'account/login.do',
        type : 'post',
        // data對象中的屬性名要和服務端控制器的參數名一致 login(name, password)
        data : {
            'name' : name,
            'password' : password
        },
        dataType : 'json',
        success : function(result) {
            if (result.state == 0) {
                // 登錄成功,設置cookie並跳轉edit.html
                addCookie('userId', result.data.id);
                addCookie('nick', result.data.nick);
                location.href = 'edit.html';
            } else {
                // 登錄失敗
                var msg = result.message;
                $('#sig_in').next().html(msg);
                $('#sig_in').next().css("color", "red");
            }
        },
        error : function(e) {
            alert("系統異常");
        }
    });
    $('#password').val("");
}

后台 Controller類中對應的方法:

 @RequestMapping("/login.do")
    @ResponseBody
    public Object login(String name, String password, HttpSession session) {
        user = userService.checkLogin(name, password);
        session.setAttribute("user", user);
        return new JsonResult(user);
    }

@RequestBody呢?

      @RequestBody是作用在形參列表上,用於將前台發送過來固定格式的數據【xml 格式或者 json等】封裝為對應的 JavaBean 對象,封裝時使用到的一個對象是系統默認配置的 HttpMessageConverter進行解析,然后封裝到形參上。

比如上面的登錄后台代碼可以改為:

    @RequestMapping("/login.do")
    @ResponseBody
    public Object login(@RequestBody User loginUuser, HttpSession session) {
        user = userService.checkLogin(loginUser);
        session.setAttribute("user", user);
        return new JsonResult(user);
    }

 2、@Controller
@Controller對應表現層的Bean,也就是Action,例如:

    @Controller
    @Scope("prototype")
     public class UserAction extends BaseAction<User>{
    ……
    }
  • 使用@Controller注解標識UserAction之后,就表示要把UserAction交給Spring容器管理,在Spring容器中會存在一個名字為"userAction"的action,這個名字是根據UserAction類名來取的。注意:如果@Controller不指定其value【@Controller】,則默認的bean名字為這個類的類名首字母小寫,如果指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,則使用value作為bean的名字。
  • 這里的UserAction還使用了@Scope注解,@Scope("prototype")表示將Action的范圍聲明為原型,可以利用容器的scope="prototype"來保證每一個請求有一個單獨的Action來處理,避免struts中Action的線程安全問題。spring 默認scope 是單例模式(scope="singleton"),這樣只會創建一個Action對象,每次訪問都是同一Action對象,數據不安全,struts2 是要求每次次訪問都對應不同的Action,scope="prototype" 可以保證當有請求的時候都創建一個Action對象
    spring中bean的scope屬性,有如下5種類型:
        1.singleton 表示在spring容器中的單例,通過spring容器獲得該bean時總是返回唯一的實例
        2.prototype表示每次獲得bean都會生成一個新的對象
        3.request表示在一次http請求內有效(只適用於web應用)
        4.session表示在一個用戶會話內有效(只適用於web應用)
        5.globalSession表示在全局會話內有效(只適用於web應用

 3、@ Service

@Service對應的是業務層Bean,例如:

     @Service("userService")
    public class UserServiceImpl implements UserService {
     ………
     }

@Service("userService")注解是告訴Spring,當Spring要創建UserServiceImpl的的實例時,bean的名字必須叫做"userService",這樣當Action需要使用UserServiceImpl的的實例時,就可以由Spring創建好的"userService",然后注入給Action:在Action只需要聲明一個名字叫“userService”的變量來接收由Spring注入的"userService"即可,具體代碼如下:

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

注意:在Action聲明的“userService”變量的類型必須是“UserServiceImpl”或者是其父類“UserService”,否則由於類型不一致而無法注入,由於Action中的聲明的“userService”變量使用了@Resource注解去標注,並且指明了其name = "userService",這就等於告訴Spring,說我Action要實例化一個“userService”,你Spring快點幫我實例化好,然后給我,當Spring看到userService變量上的@Resource的注解時,根據其指明的name屬性可以知道,Action中需要用到一個UserServiceImpl的實例,此時Spring就會把自己創建好的名字叫做"userService"的UserServiceImpl的實例注入給Action中的“userService”變量,幫助Action完成userService的實例化,這樣在Action中就不用通過“UserService userService = new UserServiceImpl();”這種最原始的方式去實例化userService了。如果沒有Spring,那么當Action需要使用UserServiceImpl時,必須通過“UserService userService = new UserServiceImpl();”主動去創建實例對象,但使用了Spring之后,Action要使用UserServiceImpl時,就不用主動去創建UserServiceImpl的實例了,創建UserServiceImpl實例已經交給Spring來做了,Spring把創建好的UserServiceImpl實例給Action,Action拿到就可以直接用了。Action由原來的主動創建UserServiceImpl實例后就可以馬上使用,變成了被動等待由Spring創建好UserServiceImpl實例之后再注入給Action,Action才能夠使用。這說明Action對“UserServiceImpl”類的“控制權”已經被“反轉”了,原來主動權在自己手上,自己要使用“UserServiceImpl”類的實例,自己主動去new一個出來馬上就可以使用了,但現在自己不能主動去new“UserServiceImpl”類的實例,new“UserServiceImpl”類的實例的權力已經被Spring拿走了,只有Spring才能夠new“UserServiceImpl”類的實例,而Action只能等Spring創建好“UserServiceImpl”類的實例后,再“懇求”Spring把創建好的“UserServiceImpl”類的實例給他,這樣他才能夠使用“UserServiceImpl”,這就是Spring核心思想“控制反轉”,也叫“依賴注入”,“依賴注入”也很好理解,Action需要使用UserServiceImpl干活,那么就是對UserServiceImpl產生了依賴,Spring把Acion需要依賴的UserServiceImpl注入(也就是“給”)給Action,這就是所謂的“依賴注入”。對Action而言,Action依賴什么東西,就請求Spring注入給他,對Spring而言,Action需要什么,Spring就主動注入給他。

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

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

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

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

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

 5.@Autowired

  • @Autowired(required=true):當使用@Autowired注解的時候,其實默認就是@Autowired(required=true),表示注入的時候,該bean必須存在,否則就會注入失敗。
  • @Autowired(required=false):表示忽略當前要注入的bean,如果有直接注入,沒有跳過,不會報錯。

 6.@ComponentScan

在springboot配置類或啟動類使用@ComponentScan注解
(作用:掃描指定包中的所有接口,相當於在每一個接口上寫@Service或@Component或@Repository或@Controller)

@ComponentScan
@MapperScan(basePackages = "com.longfor.dao")
 public class ApplicationConfig {
    
 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM