Spring中常用注解的介紹


spring中使用注解時配置文件的寫法:

<?xml version="1.0" encoding="UTF-8"?>  
<span style="font-size:18px;"><beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xsi:schemaLocation="  
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd  
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">  
  
    <aop:aspectj-autoproxy/>  
    <context:annotation-config/>  
    <context:component-scan base-package="com.test" />  
</beans>  
<context:component-scan />配置項就配置了對指定的包進行掃描,以實現依賴注入。
- @Controller
- @Service
- @Autowired
- @RequestMapping
- @RequestParam
- @ModelAttribute
- @Cacheable
- @CacheFlush
- @Resource
- @PostConstruct
- @PreDestroy
- @Repository
- @Component 
- @Scope
- @SessionAttributes
- @InitBinder
- @Required
- @Qualifier
下面介紹下一些常見注解的使用:
@Autowired  
private IReportService reportService ;  

@Autowired

Spring2.5引入了 @Autowired 注解,它可以對類成員變量、方法及構造函數進行標注,完成自動裝配的工作。另外,通過 @Autowired 可以消除get,set方法。 @Autowired是根據類型進行自動轉配的。
這里要注意 @Resource也可以實現自動裝配,但是 @Resource默認是按照名稱進行自動裝配。

@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 會自動注入這些實現類的實例,不需要額外的操作。

這里簡單介紹下什么是按類型進行裝配,什么是按名稱進行裝配?

所謂按類型,就是當Spring容器中存在一個與指定屬性類型相同的bean,那么將該屬性進行自動裝配;如果存在多個該類型的bean,那么跑出異常,並指出不能使用按類型進行自動裝配;如果沒有找到匹配的bean,則什么事都不發生。
所謂按名稱,即根據屬性名進行自動裝配,此項會檢查Spring容器中與該屬性名完全一致的的bean,進行自動裝配。

@Qualifier

@Autowired
@Qualifier("softService")
private ISoftPMService softPMService; 

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

@Component

@Component("reportAction")  
@Scope("request")  
public class ReportAction extends AbstractBaseAction  
下面的解釋來自官方文檔

@Repository@Service@Controller
@Component是所有受Spring管理組件的通用形式;
@Repository@Service@Controller則是 @Component的細化, 用來表示更具體的用例(例如,分別對應了持久化層、服務層和表現層)。 也就是說, 你能用 @Component來注解你的組件類,
但如果用 @Repository@Service@Controller來注解它們,你的類也許能更好地被工具處理,或與切面進行關聯。
例如,這些典型化注解可以成為理想的切入點目標。當然,在Spring Framework以后的版本中,@Repository@Service@Controller也許還能攜帶更多語義。如此一來,如果你正在考慮服務層中是該用 @Component還是 @Service
@Service顯然是更好的選擇。同樣的,就像前面說的那樣,@Repository已經能在持久化層中進行異常轉換時被作為標記使用了。

@Controller

<!--方式一--在SpringMVC 的配置文件中定義MyController 的bean 對象-->
<bean class="com.host.app.web.controller.MyController"/>
<!--方式二--在SpringMVC 的配置文件中告訴Spring 該到哪里去找標記為@Controller 的Controller 控制器。-->
< context:component-scan base-package = "com.host.app.web" />//路徑寫到controller的上一層

在SpringMVC 中,控制器Controller負責處理由DispatcherServlet分發的請求,它把用戶請求的數據經過業務處理層處理之后封裝成一個Model,然后再把該Model返回給對應的View進行展示。在SpringMVC中提供了一個非常簡便的定義Controller的方法,你無需繼承特定的類或實現特定的接口,只需使用 @Controller標記一個類是Controller,然后使用 @RequestMapping和 @RequestParam等一些注解用以定義URL請求和Controller方法之間的映射,這樣的Controller就能被外界訪問到。此外Controller不會直接依賴於HttpServletRequest 和HttpServletResponse等HttpServlet對象,它們可以通過Controller的方法參數靈活的獲取到。

@Service

@Service
public class SoftCreateServiceImpl implements ISoftCreateService {}
//或者
@Service("softCreateServiceImpl")

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

@Repository

與 @Controller 、 @Service 類似,都是向spring 上下文中注冊bean。

@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 屬性不需要指定 ( 或者指定為""),否則注入失敗;

@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=RequestMethod.POST)
@RequestMapping(value="/osu/product/detail.do", params={"modify=false"}, method=RequestMethod.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參數綁定。

RequestMapping注解有六個屬性,下面我們把她分成三類進行說明(下面有相應示例)。
1、 value, method;
value:指定請求的實際地址,指定的地址可以是URI Template 模式(后面將會說明);
method:指定請求的method類型,GET、POST、PUT、DELETE等;
2、consumes,produces
consumes: 指定處理請求的提交內容類型(Content-Type),例如application/json, text/html;
produces:    指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回;
3、params,headers
params: 指定request中必須包含某些參數值是,才讓該方法處理。
headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請求。

@RequestParam

@RequestParam("id")
@RequestParam(required=false) //參數不是必須的,默認為true
@RequestParam(value="id",required=false)
http://localhost/bbtForum.do?method=listBoardTopic&id=1&userId=10&userName=tom

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

@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

@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"})

Spring 允許我們有選擇地指定 ModelMap 中的哪些屬性需要轉存到 session 中,
以便下一個請求屬對應的 ModelMap 的屬性列表中還能訪問到這些屬性。
這一功能是通過類定義處標注 @SessionAttributes 注解來實現的。
@SessionAttributes 只能聲明在類上,而不能聲明在方法上。

@Controller  
@RequestMapping("/bbtForum.do")  
@SessionAttributes("currUser") //@1將ModelMap中屬性名為currUser的屬性  
//放到Session屬性列表中,以便這個屬性可以跨請求訪問</span>  
public class BbtForumController {  
…  
    @RequestMapping(params = "method=listBoardTopic")  
    public String listBoardTopic(@RequestParam("id")int topicId, User user,  
ModelMap model) {  
        bbtForumService.getBoardTopics(topicId);  
        model.addAttribute("currUser",user);//@2向ModelMap中添加一個屬性</span>  
        return "listTopic";  
    }  
  
}  

我們在 @2處添加了一個 ModelMap 屬性,其屬性名為 currUser,而 @1處通過 @SessionAttributes 注解將 ModelMap 中名為 currUser 的屬性放置到 Session 中,所以我們不但可以在 listBoardTopic() 請求所對應的 JSP 視圖頁面中通過 request.getAttribute(“currUser”) 和 session.getAttribute(“currUser”) 獲取 user 對象,還可以在下一個請求所對應的 JSP 視圖頁面中通過 session.getAttribute(“currUser”) 或 ModelMap#get(“currUser”) 訪問到這個屬性。

@ModelAttribute

@Controller  
@SessionAttributes("currentUser")
public class GreetingController{  
    @RequestMapping  
    public void hello(@ModelAttribute("currentUser") User user){  
      //user.sayHello()  
    }  
}

我們可以在需要訪問Session屬性的controller上加上 @SessionAttributes,然后在action需要的User參數上加上 @ModelAttribute,並保證兩者的屬性名稱一致。SpringMVC就會自動將 @SessionAttributes定義的屬性注入到ModelMap對象,在setup action的參數列表時,去ModelMap中取到這樣的對象,再添加到參數列表。只要我們不去調用SessionStatus的setComplete()方法,這個對象就會一直保留在Session中,從而實現Session信息的共享。

@Required

@Required              
public setName (String name) {}

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

@PostConstruct

在方法上加上注解 @PostConstruct,這個方法就會在Bean初始化之后被Spring容器執行(注:Bean 初始化包括,實例化Bean,並裝配Bean的屬性(依賴注入))。

@PreDestroy

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

@PathVariable

@Controller  
public class TestController {  
     @RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET)  
     public String getLogin(@PathVariable("userId") String userId,  
         @PathVariable("roleId") String roleId){  
         System.out.println("User Id : " + userId);  
         System.out.println("Role Id : " + roleId);  
         return "hello";  
     }  
}

用於將請求URL中的模板變量映射到功能處理方法的參數上,即取出uri模板中的變量作為參數。


免責聲明!

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



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