spring常用的一些註解以及註解注入總結
@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("userController")
• 說明
@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") 本文來自www.itxxz.com
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 copyright www.itxxz.com
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
• 作用域: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 裡 itxxz.com
@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 。
@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){}
• 說明 copyright www.itxxz.com
@ 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,可以用來指定欄位是否是必須的,如果是必需的,則在找不到合適的例項注入時會丟擲異常。
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的效果是一樣的。
相關文章
- Spring/SpringBoot常用註解總結Spring Boot
- Spring-註解注入Spring
- Spring常用註解Spring
- Spring 常用的註解以及對應 XML 配置詳解SpringXML
- SwaggerAPI註解詳解,以及註解常用引數配置SwaggerAPI
- Spring系列之新註解配置+Spring整合junit+註解注入Spring
- spring 框架常用註解Spring框架
- Spring MVC 常用註解的使用SpringMVC
- spring註解開發(一)Bean注入SpringBean
- spring boot的常用註解有哪些?Spring Boot
- spring中常見的一些註解Spring
- Spring IOC 常用註解與使用Spring
- Spring Boot入門(四):開發Web Api介面常用註解總結Spring BootWebAPI
- Spring注入:配置注入(set注入和構造器注入)與註解注入Spring
- Spring的IOC常用註解(含原始碼)Spring原始碼
- Java必須掌握的Spring常用註解JavaSpring
- 常用註解
- 【Spring註解】事務註解@TransactionalSpring
- Spring註解Spring
- SpringMvc的常用註解SpringMVC
- JPA常用註解彙總紀要
- JAVA註解的總結及其作用Java
- Spring MVC常用註解,你會幾個?SpringMVC
- Springboot 常用註解Spring Boot
- Lombok常用註解Lombok
- 從Hessian RPC 註解方式看Spring依賴注入RPCSpring依賴注入
- 省掉bean自定義spring mvc註解注入json值BeanSpringMVCJSON
- 自定義註解以及註解在反射中的應用反射
- Spring 註解程式設計之模式註解Spring程式設計模式
- Spring新註解Spring
- Spring註解大全Spring
- Spring boot註解Spring Boot
- Spring : @SessionAttributes註解SpringSession
- Spring中重要的註解Spring
- Spring的@PropertySource註解使用Spring
- Spring AOP的AspectJ註解Spring
- Spring的註解開發Spring
- 002 SpringBoot 常用註解Spring Boot
- MyBatisPlus-常用註解MyBatis