1. 程式人生 > >Spring2.5 註解介紹(3.0通用)

Spring2.5 註解介紹(3.0通用)

 

Auther: 韓群峰 Version: 1.0.0 Date: 2011-03-15

  註解說明

• 註冊註解處理器

• 方式一:bean

<bean class="org.springframework.beans.factory.annotation.
AutowiredAnnotationBeanPostProcessor"/>

• 方式二: 名稱空間<context:annotation-config />

<context:annotationconfig /> 將隱式地向Spring 容器註冊AutowiredAnnotationBeanPostProcessor 、CommonAnnotationBeanPostProcessor 、 PersistenceAnnotationBeanPostProcessor 以及RequiredAnnotationBeanPostProcessor 這4 個BeanPostProcessor 。

• 方式三: 名稱空間<context:component-scan />

如果要使註解工作,則必須配置component-scan ,實際上不需要再配置annotation-config。

base-package 屬性指定了需要掃描的類包,類包及其遞迴子包中所有的類都會被處理。還允許定義過濾器將基包下的某些類納入或排除。

• Spring 支援以下4 種類型的過濾方式:

              • 註解 org.example.SomeAnnotation 將所有使用SomeAnnotation 註解的類過濾出來

              • 類名指定 org.example.SomeClass 過濾指定的類

              • 正則表示式 com.kedacom.spring.annotation.web..* 通過正則表示式過濾一些類

              • AspectJ 表示式 org.example..*Service+ 通過AspectJ 表示式過濾一些類

• 正則表示式的過濾方式舉例:

<context:component-scanbase-package="com.casheen.spring.annotation">

<context:exclude-filtertype="regex"
expression="com.casheen.spring.annotation.web..*"/>
</context:component-scan>

• 註解的過濾方式舉例:

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

<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Service"/>
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Repository"/>

</context:component-scan>

啟用Spring MVC 註解

• 啟動Spring MVC 的註解功能,完成請求和註解POJO 的對映

• <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

註解介紹

              • @Controller

              • @Service

              • @Autowired

              • @RequestMapping

              • @RequestParam

              • @ModelAttribute

              • @Cacheable

              • @CacheFlush

              • @Resource

              • @PostConstruct

              • @PreDestroy

              • @Repository

              • @Component (不推薦使用)

              • @Scope

              • @SessionAttributes

              • @InitBinder

              • @Required

              • @Qualifier

@Controller

              • 例如

              @Controller
              public class SoftCreateController extends SimpleBaseController {}

              • 或者
             @Controller("softCreateController")

              • 說明

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

@Service

              • 例如

              @Service
              public class SoftCreateServiceImpl implements ISoftCreateService {}

              • 或者
              @Service("softCreateServiceImpl")

              • 說明

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

@Autowired

              • 例如

              @Autowired
              private ISoftPMService softPMService;

              • 或者

     @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(int topicId,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 請求:

topicId URL 引數將繫結到 topicId 入參上,而 userId 和 userName URL 引數將繫結到 user 物件的 userId 和 userName 屬性中。和 URL 請求中不允許沒有 topicId 引數不同,雖然 User 的 userId 屬性的型別是基本資料型別,但如果 URL 中不存在 userId 引數,Spring 也不會報錯,此時 user.userId 值為 0 。如果 User 物件擁有一個 dept.deptId 的級聯屬性,那麼它將和 dept.deptId URL 引數繫結。

@RequestParam

• 引數繫結說明
@RequestParam("id")

listBoardTopic(@RequestParam("id")int topicId,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 String setupForm(@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")

              • 說明

@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 UserSessionBean implementsSerializable {}

              • 說明

在使用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(WebDataBinder binder) {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));

}

@Required

              • 例如

              @required              

              public  setName(String name){}

              • 說明

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

@Qualifier

              • 例如

              @Autowired

              @Qualifier("softService")
              private ISoftPMService softPMService;

         • 說明

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

參考資料

              • jdk1.5 註解介紹

              • spring2.5 註解

• spring3.0 註解

=======================================================================================================

 @Controller
              • @Service
              • @Autowired
              • @RequestMapping
              • @RequestParam
              • @ModelAttribute
              • @Cacheable
              • @CacheFlush
              • @Resource
              • @PostConstruct
              • @PreDestroy
              • @Repository
              • @Component (不推薦使用)
              • @Scope
              • @SessionAttributes
              • @InitBinder
              • @Required
              • @Qualifier
 

 
@Controller
              • 例如
              @Controller
              public class SoftCreateController extends SimpleBaseController {}

              • 或者
             @Controller("softCreateController")

              • 說明
              @Controller 負責註冊一個bean 到spring 上下文中,bean 的ID 預設為類名稱開頭字母小寫
 

 
@Service
              • 例如
              @Service
              public class SoftCreateServiceImpl implements ISoftCreateService {}

              • 或者
              @Service("softCreateServiceImpl")

              • 說明
              @Service 負責註冊一個bean 到spring 上下文中,bean 的ID 預設為類名稱開頭字母小寫
 

 
@Autowired
              • 例如
              @Autowired
              private ISoftPMService softPMService;

              • 或者
 
     @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(int topicId,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 和 userName URL 引數將繫結到 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")int topicId,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 String setupForm(@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 UserSessionBean implementsSerializable {}
 
              • 說明
 
在使用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(WebDataBinder binder) {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));

}
 
 
@Required
              • 例如
              @required              
              public  setName(String name){} 

              • 說明
              @ required 負責檢查一個bean在初始化時其宣告的 set方法是否被執行, 當某個被標註了 @Required 的 Setter 方法沒有被呼叫,則 Spring 在解析的時候會丟擲異常,以提醒開發者對相應屬性進行設定。 @Required 註解只能標註在 Setter 方法之上。因為依賴注入的本質是檢查 Setter 方法是否被呼叫了,而不是真的去檢查屬性是否賦值了以及賦了什麼樣的值。如果將該註解標註在非 setXxxx() 型別的方法則被忽略。
 
@Qualifier
              • 例如
              @Autowired
              @Qualifier("softService")
              private ISoftPMService softPMService; 
         • 說明
            使用@Autowired 時,如果找到多個同一型別的bean,則會拋異常,此時可以使用 @Qualifier("beanName"),明確指定bean的名稱進行注入,此時與 @Resource指定name屬性作用相同。