JavaWeb-Spring中註解大全與詳解

經常使用的spring註解有以下幾種:

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

@Controller

  • 例如java

    @Controllermysql

    public class SoftCreateController extends SimpleBaseController {}web

  • 或者ajax

@Controller("userController")spring

  • 說明

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

@Service

例如 @Service public class SoftCreateServiceImpl implements ISoftCreateService {}緩存

• 或者 @Service("softCreateServiceImpl")session

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

@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/itxxzSpring4?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/itxxzSpring4?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 ) 本文來自www.itxxz.com

• 命令/ 表單對象(注:通常稱綁定使用 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 : 參數對應Bean實體

• 做用域: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 是全部受Spring 管理組件的通用形式,Spring 還提供了更加細化的註解形式: @Repository 、@Service 、@Controller ,它們分別對應存儲層Bean ,業務層Bean ,和展現層Bean 。 目前版本(2.5 )中,這些註解與@Component 的語義是同樣的,徹底通用, 在Spring 之後的版本中可能會給它們追加更多的語義。 因此,咱們推薦使用@Repository 、@Service 、@Controller 來替代@Component 。

@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屬性做用相同。

註解注入

註解注入顧名思義就是經過註解來實現注入,Spring和注入相關的常見註解有Autowired、Resource、Qualifier、Service、Controller、Repository、Component。

  • Autowired是自動注入,自動從spring的上下文找到合適的bean來注入
  • Resource用來指定名稱注入
  • Qualifier和Autowired配合使用,指定bean的名稱
  • Service,Controller,Repository分別標記類是Service層類,Controller層類,數據存儲層的類,spring掃描註解配置時,會標記這些類要生成bean。
  • Component是一種泛指,標記類是組件,spring掃描註解配置時,會標記這些類要生成bean。

上面的Autowired和Resource是用來修飾字段,構造函數,或者設置方法,並作注入的。而Service,Controller,Repository,Component則是用來修飾類,標記這些類要生成bean。

下面咱們經過實例項目來看下spring註解注入的使用。

首先新建一個maven項目,並在pom中添加spring相關的依賴,若是不知道添加那些依賴,請參照上一篇文章。

而後新建CarDao類,給它添加@Repository註解,以下代碼:

package cn.outofmemory.helloannotation;

import org.springframework.stereotype.Repository;

@Repository
public class CarDao {

    public void insertCar(String car) {
        String insertMsg = String.format("inserting car %s", car);
        System.out.println(insertMsg);
    }

}

新建CarService類,並給該類標註@Service註解,在這個類中定義CarDao的字段,並經過Autowired來修飾此字段,這樣上面定義的CarDao類的實例就會自動注入到CarService的實例中了。

package cn.outofmemory.helloannotation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class CarService {

    @Autowired
    private CarDao carDao;

    public void addCar(String car) {
        this.carDao.insertCar(car);
    }
}

注意:Autowired註解有一個能夠爲空的屬性required,能夠用來指定字段是不是必須的,若是是必需的,則在找不到合適的實例注入時會拋出異常。

下面咱們在App.java中使用上面測試下註解注入:

package cn.outofmemory.helloannotation;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext appContext = new AnnotationConfigApplicationContext("cn.outofmemory.helloannotation");
        CarService service = appContext.getBean(CarService.class);
        service.addCar("寶馬");
    }
}

在上面的main方法中首先咱們初始化了appContext,他是AnnotationConfigApplicationContext,它的構造函數接受一個package的名稱,來限定要掃描的package。而後就能夠經過appContext的getBean方法得到CarService的實例了。

上面的例子很是簡單,單純的使用AnnotationConfigApplicationContext就能夠了,可是在實際項目中狀況每每沒有這麼簡單,仍是須要spring配置文件的。在spring配置文件中也能夠經過下面的配置讓spring自動掃描註解配置。

<!-- bean annotation driven -->
    <context:annotation-config />

    <context:component-scan base-package="cn.outofmemory.helloannotation" >
    </context:component-scan>

下面咱們看下混合使用spring配置和註解的例子,首先在項目中添加source folder,src/main/resources,並添加spring.xml, 其內容以下:

<?xml version="1.0" encoding="utf-8"?>
<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"
 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 ">

    <!-- bean annotation driven -->
    <context:annotation-config />
    <context:component-scan base-package="cn.outofmemory.helloannotation" >
    </context:component-scan>

    <bean id="sqliteCarDao" class="cn.outofmemory.helloannotation.CarDao" >
        <constructor-arg name="driver" value="sqlite"/>
    </bean> 
 </beans>

在上面的配置文件中,咱們經過context:annotation-config和context:component-sacn節點來指定要掃描註解注入,而後又定義了一個id爲sqliteCarDao的bean,它的構造函數的driver值爲sqlite。

咱們修改下App.java使用xml配置文件,再運行下App看下會怎樣。

package cn.outofmemory.helloannotation;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        //ApplicationContext appContext = new AnnotationConfigApplicationContext("cn.outofmemory.helloannotation");

        ApplicationContext appContext = new ClassPathXmlApplicationContext("/spring.xml");
        CarService service = appContext.getBean(CarService.class);
        service.addCar("寶馬");
    }
}

運行程序發現輸出爲:inserting car 寶馬 into mysql,顯然CarService自動注入的CarDao使用了默認構造函數構造的實例。是否能夠經過註解指定使用spring.xml中配置的sqliteCarDao呢?

咱們能夠修改下CarService類,經過Qualifier註解來指定要使用的bean的名字。

以下,在指定Autowired註解時,同時指定Qualifier註解指定bean的名字

@Autowired
    @Qualifier("sqliteCarDao")
    private CarDao carDao;

從新運行下App.java 此次輸出的是inserting car 寶馬 into sqlite,此次使用了spring.xml中配置的bean了。

在文中開頭咱們還提到了Resouce註解,這個註解能夠指定名字注入,咱們再次修改下CarService類:

@Resource(name="sqliteCarDao")
    private CarDao carDao;

javax.annotation.Resource註解實現的效果和@Autowired+@Qualifier的效果是同樣的。

相關文章
相關標籤/搜索