springMVC常用註解

@Controller

              • 例如

              @Controller

              public class SoftCreateControllerextends SimpleBaseController {}

 

              • 或者

            @Controller("softCreateController")

 

              • 說明

              @Controller 負責註冊一個bean 到spring 上下文中,bean的ID 默認爲類名稱開頭字母小寫

 

@Service

              • 例如

              @Service

              public classSoftCreateServiceImpl implements ISoftCreateService {}

 

              • 或者

             @Service("softCreateServiceImpl")

 

              • 說明

              @Service 負責註冊一個bean 到spring 上下文中,bean的ID 默認爲類名稱開頭字母小寫

 

@Autowired

              • 例如

              @Autowired

              private ISoftPMServicesoftPMService;

 

              • 或者

 

    @Autowired(required=false)

    private ISoftPMService softPMService = new SoftPMServiceImpl();

 

        • 說明

   @Autowired 根據bean 類型從spring上線文中進行查找,註冊類型必須唯一,否則報異常。與@Resource 的區別在於,@Resource 允許通過bean 名稱或bean 類型兩種方式進行查找@Autowired(required=false) 表示,如果spring 上下文中沒有找到該類型的bean 時, 纔會使用new SoftPMServiceImpl();

 

@Autowired 標註作用於Map 類型時,如果 Map 的 key 爲 String 類型,則 Spring 會將容器中所有類型符合 Map 的 value 對應的類型的Bean 增加進來,用 Bean 的 id 或 name 作爲 Map 的 key。

 

@Autowired 還有一個作用就是,如果將其標註在 BeanFactory 類型、ApplicationContext 類型、ResourceLoader 類型、ApplicationEventPublisher 類型、MessageSource 類型上,那麼 Spring 會自動注入這些實現類的實例,不需要額外的操作。

 

@RequestMapping

• 類

@Controller

@RequestMapping("/bbtForum.do")

public class BbtForumController {

            @RequestMapping(params = "method=listBoardTopic")

public String listBoardTopic(inttopicId,User user) {}

}

 

  • 方法

             @RequestMapping("/softpg/downSoftPg.do")

             @RequestMapping(value="/softpg/ajaxLoadSoftId.do",method =POST)

              @RequestMapping(value ="/osu/product/detail.do", params = { "modify=false" },method =POST)

 

  • 說明

   @RequestMapping 可以聲明到類或方法上

 

• 參數綁定說明

如果我們使用以下的 URL 請求:

http://localhost/bbtForum.do?method=listBoardTopic&topicId=1&userId=10&userName=tom

topicId URL 參數將綁定到topicId 入參上,而 userId 和 userNameURL 參數將綁定到 user 對象的 userId 和 userName 屬性中。和 URL 請求中不允許沒有 topicId 參數不同,雖然 User 的 userId 屬性的類型是基本數據類型,但如果 URL 中不存在 userId 參數,Spring 也不會報錯,此時 user.userId 值爲 0 。如果 User 對象擁有一個 dept.deptId 的級聯屬性,那麼它將和 dept.deptId URL 參數綁定。

 

@RequestParam

• 參數綁定說明

@RequestParam("id")

 

http://localhost/bbtForum.do?method=listBoardTopic&id=1&userId=10&userName=tom

listBoardTopic(@RequestParam("id")inttopicId,User user) 中的 topicId 綁定到 id 這個 URL 參數, 那麼可以通過對入參使用 @RequestParam 註解來達到目的

 

@RequestParam(required=false):參數不是必須的,默認爲true

@RequestParam(value="id",required=false)

 

請求處理方法入參的可選類型

              • Java 基本數據類型和 String

                    默認情況下將按名稱匹配的方式綁定到 URL 參數上,可以通過 @RequestParam 註解改變默認的綁定規則

 

              • request/response/session

 既可以是 Servlet API 的也可以是 Portlet API 對應的對象,Spring 會將它們綁定到Servlet 和 Portlet 容器的相應對象上

 

•org.springframework.web.context.request.WebRequest

 內部包含了 request 對象

 

• java.util.Locale

綁定到 request 對應的Locale 對象上

 

       • java.io.InputStream/java.io.Reader

                可以藉此訪問request 的內容

 

       • java.io.OutputStream / java.io.Writer

可以藉此操作 response 的內容

 

        • 任何標註了 @RequestParam 註解的入參

                被標註@RequestParam 註解的入參將綁定到特定的 request 參數上。

 

        • java.util.Map / org.springframework.ui.ModelMap

它綁定 Spring MVC 框架中每個請求所創建的潛在的模型對象,它們可以被 Web 視圖對象訪問(如 JSP )

 

        • 命令/ 表單對象(注:一般稱綁定使用HTTP GET 發送的 URL 參數的對象爲命令對象,而稱綁定使用HTTP POST 發送的 URL 參數的對象爲表單對象)

                     它們的屬性將以名稱匹配的規則綁定到 URL 參數上,同時完成類型的轉換。

                     而類型轉換的規則可以通過 @InitBinder 註解或通過 HandlerAdapter 的配置進行調整

 

   •org.springframework.validation.Errors /org.springframework.validation.BindingResult

                    爲屬性列表中的命令/ 表單對象的校驗結果,注意檢驗結果參數必須緊跟在命令/ 表單對象的後面

 

    •org.springframework.web.bind.support.SessionStatus

 可以通過該類型 status 對象顯式結束表單的處理,這相當於觸發 session 清除其中的通過@SessionAttributes 定義的屬性

 

請求處理方法返回值的可選類型

• void

此時邏輯視圖名由請求處理方法對應的 URL 確定,如以下的方法:

@RequestMapping("/welcome.do")

public void welcomeHandler() {}

對應的邏輯視圖名爲 “ welcome ”

 

• String

此時邏輯視圖名爲返回的字符,如以下的方法:

@RequestMapping(method = RequestMethod.GET)

public StringsetupForm(@RequestParam("ownerId") int ownerId, ModelMap model) {

 

Owner owner = this.clinic.loadOwner(ownerId);

model.addAttribute(owner);

return "ownerForm";

 

}

對應的邏輯視圖名爲 “ ownerForm ”

 

• org.springframework.ui.ModelMap

和返回類型爲 void 一樣,邏輯視圖名取決於對應請求的 URL ,如下面的例子:

@RequestMapping("/vets.do")

public ModelMap vetsHandler() {

return new ModelMap(this.clinic.getVets());

}

對應的邏輯視圖名爲 “ vets ” ,返回的 ModelMap 將被作爲請求對應的模型對象,可以在 JSP 視圖頁面中訪問到。

 

• ModelAndView

當然還可以是傳統的 ModelAndView 。

 

@ModelAttribute

              • 作用域:request

              • 例如

            @RequestMapping("/base/userManageCooper/init.do")

            public String handleInit(@ModelAttribute("queryBean")ManagedUser sUser,Model model,){

 

              • 或者

             @ModelAttribute("coopMap")// 將coopMap 返回到頁面

          public Map<Long,CooperatorInfo> coopMapItems(){}

 

             • 說明

 

@ModelAttribute 聲明在屬性上,表示該屬性的value 來源於model 裏"queryBean",並被保存到model 裏@ModelAttribute 聲明在方法上,表示該方法的返回值被保存到model 裏

 

@Cacheable 和@CacheFlush

              • @Cacheable :聲明一個方法的返回值應該被緩存

              例如:@Cacheable(modelId= "testCaching")

 

              • @CacheFlush :聲明一個方法是清空緩存的觸發器

                 例如:@CacheFlush(modelId= "testCaching")

 

              • 說明

               要配合緩存處理器使用,參考: http://hanqunfeng.iteye.com/blog/603719

 

@Resource

              • 例如

              @Resource

              private DataSource dataSource; //inject the bean named 'dataSource'

 

              • 或者

 

@Resource(name="dataSource")

@Resource(type=DataSource.class)

 

• 說明

@Resource 默認按bean 的name 進行查找,如果沒有找到會按type 進行查找,

此時與@Autowired 類 似

在沒有爲 @Resource 註解顯式指定 name 屬性的前提下,如果將其標註在 BeanFactory 類型、ApplicationContext 類型、ResourceLoader 類型、ApplicationEventPublisher 類型、MessageSource 類型上,那麼 Spring 會自動注入這些實現類的實例,不需要額外的操作。此時 name 屬性不需要指定 ( 或者指定爲""),否則注入失敗;

@PostConstruct 和@PreDestroy

• @PostConstruct

在方法上加上註解@PostConstruct ,這個方法就會在Bean 初始化之後被Spring 容器執 行

(注:Bean 初始化包括,實例化Bean,並裝配Bean 的屬性(依賴注入))。

 

• @PreDestroy

在方法上加上註解@PreDestroy ,這個方法就會在Bean 被銷燬前被Spring 容器執行。

 

@Repository

• 與@Controller 、@Service 類似,都是向spring 上下文中註冊bean ,不在贅述。

 

@Component (不推薦使用)

• @Component

@Component 是所有受Spring管理組件的通用形式,Spring 還提供了更加細化的註解形式:  @Repository 、@Service、@Controller ,它們分別對應存儲層Bean ,業務層Bean ,和展示層Bean 。

目前版本(2.5 )中,這些註解與@Component的語義是一樣的,完全通用, 在Spring 以後的版本中可能會給它們追加更多的語義。 所以,我們推薦使用@Repository 、@Service 、@Controller 來替代@Component 。

 

@Scope

              • 例如

                @Scope("session")

                @Repository()

                public class UserSessionBeanimplementsSerializable {}

 

              • 說明

 

在使用XML 定義Bean 時,可以通過bean 的scope 屬性來定義一個Bean的作用範圍,

同樣可以通過@Scope 註解來完成

 

      @Scope中可以指定如下值:

      singleton:定義bean的範圍爲每個spring容器一個實例(默認值)

      prototype:定義bean可以被多次實例化(使用一次就創建一次)

      request:定義bean的範圍是http請求(springMVC中有效)

      session:定義bean的範圍是http會話(springMVC中有效)

       global-session:定義bean的範圍是全局http會話(portlet中有效)

 

@SessionAttributes

• 說明

Spring 允許我們有選擇地指定ModelMap 中的哪些屬性需要轉存到 session 中,

以便下一個請求屬對應的 ModelMap 的屬性列表中還能訪問到這些屬性。

這一功能是通過類定義處標註 @SessionAttributes 註解來實現的。

@SessionAttributes 只能聲明在類上,而不能聲明在方法上。

• 例如

@SessionAttributes("currUser") //將ModelMap 中屬性名爲currUser 的屬性

@SessionAttributes({"attr1","attr2"})

@SessionAttributes(types = User.class)

@SessionAttributes(types ={User.class,Dept.class})

@SessionAttributes(types ={User.class,Dept.class},value={"attr1","attr2"})

 

@InitBinder

• 說明

如果希望某個屬性編輯器僅作用於特定的 Controller ,

可以在 Controller 中定義一個標註 @InitBinder 註解的方法,

可以在該方法中向 Controller 了註冊若干個屬性編輯器

 

• 例如

@InitBinder

public void initBinder(WebDataBinderbinder) {

 

SimpleDateFormat dateFormat = newSimpleDateFormat("yyyy-MM-dd");

dateFormat.setLenient(false);

binder.registerCustomEditor(Date.class, newCustomDateEditor(dateFormat, false));

 

}

 

@Required

              • 例如

              @required             

              public  setName(String name){}

 

              • 說明

              @ required 負責檢查一個bean在初始化時其聲明的 set方法是否被執行, 當某個被標註了 @Required 的 Setter 方法沒有被調用,則 Spring 在解析的時候會拋出異常,以提醒開發者對相應屬性進行設置。@Required 註解只能標註在 Setter 方法之上。因爲依賴注入的本質是檢查 Setter 方法是否被調用了,而不是真的去檢查屬性是否賦值了以及賦了什麼樣的值。如果將該註解標註在非 setXxxx() 類型的方法則被忽略。

 

@Qualifier

              • 例如

              @Autowired

             @Qualifier("softService")

              private ISoftPMServicesoftPMService;

        • 說明

           使用@Autowired 時,如果找到多個同一類型的bean,則會拋異常,此時可以使用@Qualifier("beanName"),明確指定bean的名稱進行注入,此時與 @Resource指定name屬性作用相同。

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