日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JavaWeb-Spring中注解大全与详解

發(fā)布時間:2025/3/21 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaWeb-Spring中注解大全与详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

常用的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

? 例如

?@Servicepublic 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 根據(jù)bean 類型從spring 上下文中進行查找,注冊類型必須唯一,否則報異常。?

與@Resource 的區(qū)別在于,@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 會自動注入這些實現(xiàn)類的實例,不需要額外的操作。


@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 可以聲明到類或方法上

? 參數(shù)綁定說明
如果我們使用以下的 URL 請求:
http://localhost/itxxzSpring4?method=listBoardTopic&topicId=1&userId=10&userName=tom
topicId URL 參數(shù)將綁定到 topicId 入?yún)⑸?#xff0c;而 userId 和 userName URL 參數(shù)將綁定到 user 對象的 userId 和 userName 屬性中。和 URL 請求中不允許沒有 topicId 參數(shù)不同,雖然 User 的 userId 屬性的類型是基本數(shù)據(jù)類型,但如果 URL 中不存在 userId 參數(shù),Spring 也不會報錯,此時 user.userId 值為 0 。如果 User 對象擁有一個 dept.deptId 的級聯(lián)屬性,那么它將和 dept.deptId URL 參數(shù)綁定。


@RequestParam

? 參數(shù)綁定說明
@RequestParam("id")

http://localhost/itxxzSpring4?method=listBoardTopic&id=1&userId=10&userName=tom
listBoardTopic(@RequestParam("id")int topicId,User user) 中的 topicId 綁定到 id 這個 URL 參數(shù), 那么可以通過對入?yún)⑹褂?@RequestParam 注解來達到目的?

@RequestParam(required=false):參數(shù)不是必須的,默認為true
@RequestParam(value="id",required=false)


請求處理方法入?yún)⒌目蛇x類型

? Java 基本數(shù)據(jù)類型和 String
????????????默認情況下將按名稱匹配的方式綁定到 URL 參數(shù)上,可以通過 @RequestParam 注解改變默認的綁定規(guī)則

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

? org.springframework.web.context.request.WebRequest
????????????內(nèi)部包含了 request 對象

? java.util.Locale?
????????????綁定到 request 對應的 Locale 對象上

? java.io.InputStream/java.io.Reader
????????????????可以借此訪問 request 的內(nèi)容?

? java.io.OutputStream / java.io.Writer
????????????可以借此操作 response 的內(nèi)容

? 任何標注了 @RequestParam 注解的入?yún)?
????????????被標注 @RequestParam 注解的入?yún)⒔壎ǖ教囟ǖ?request 參數(shù)上。

? java.util.Map / org.springframework.ui.ModelMap
????????????它綁定 Spring MVC 框架中每個請求所創(chuàng)建的潛在的模型對象,它們可以被 Web 視圖對象訪問(如 JSP )

? 命令/ 表單對象(注:一般稱綁定使用 HTTP GET 發(fā)送的 URL 參數(shù)的對象為命令對象,而稱綁定使用HTTP POST 發(fā)送的 URL 參數(shù)的對象為表單對象)
?????????????它們的屬性將以名稱匹配的規(guī)則綁定到 URL 參數(shù)上,同時完成類型的轉(zhuǎn)換。
?????????????而類型轉(zhuǎn)換的規(guī)則可以通過 @InitBinder 注解或通過 HandlerAdapter 的配置進行調(diào) 整

?? org.springframework.validation.Errors / org.springframework.validation.BindingResult
?????????????為屬性列表中的命令/ 表單對象的校驗結(jié)果,注意檢驗結(jié)果參數(shù)必須緊跟在命令/ 表單對象的后面?

? org.springframework.web.bind.support.SessionStatus
????????????可以通過該類型 status 對象顯式結(jié)束表單的處理,這相當于觸發(fā) 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
當然還可以是傳統(tǒng)的 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 :聲明一個方法是清空緩存的觸發(fā)器
例如:@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 會自動注入這些實現(xiàn)類的實例,不需要額外的操作。此時 name 屬性不需要指定 ( 或者指定為""),否則注入失敗;

@PostConstruct 和@PreDestroy

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

??@PreDestroy

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


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


@Component?(不推薦使用)

@Component 是所有受Spring 管理組件的通用形式,Spring 還提供了更加細化的注解形式:??@Repository 、@Service 、@Controller ,它們分別對應存儲層Bean ,業(yè)務層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可以被多次實例化(使用一次就創(chuàng)建一次)
???????request:定義bean的范圍是http請求(springMVC中有效)
???????session:定義bean的范圍是http會話(springMVC中有效)
???????global-session:定義bean的范圍是全局http會話(portlet中有效)?

@SessionAttributes

? 說明
Spring 允許我們有選擇地指定 ModelMap 中的哪些屬性需要轉(zhuǎn)存到 session 中,
以便下一個請求屬對應的 ModelMap 的屬性列表中還能訪問到這些屬性。
這一功能是通過類定義處標注 @SessionAttributes 注解來實現(xiàn)的。
@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方法是否被執(zhí)行, 當某個被標注了 @Required 的 Setter 方法沒有被調(diào)用,則 Spring 在解析的時候會拋出異常,以提醒開發(fā)者對相應屬性進行設置。 @Required 注解只能標注在 Setter 方法之上。因為依賴注入的本質(zhì)是檢查 Setter 方法是否被調(diào)用了,而不是真的去檢查屬性是否賦值了以及賦了什么樣的值。如果將該注解標注在非 setXxxx() 類型的方法則被忽略。

@Qualifier

? 例如

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

?? 說明

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


注解注入

注解注入顧名思義就是通過注解來實現(xiàn)注入,Spring和注入相關(guān)的常見注解有Autowired、Resource、Qualifier、Service、Controller、Repository、Component。

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

上面的Autowired和Resource是用來修飾字段,構(gòu)造函數(shù),或者設置方法,并做注入的。而Service,Controller,Repository,Component則是用來修飾類,標記這些類要生成bean。

下面我們通過實例項目來看下spring注解注入的使用。

首先新建一個maven項目,并在pom中添加spring相關(guān)的依賴,如果不知道添加那些依賴,請參照上一篇文章。

然后新建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 {@Autowiredprivate 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,它的構(gòu)造函數(shù)接受一個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, 其內(nèi)容如下:

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://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節(jié)點來指定要掃描注解注入,然后又定義了一個id為sqliteCarDao的bean,它的構(gòu)造函數(shù)的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("寶馬");} }

運行程序發(fā)現(xiàn)輸出為:inserting car 寶馬 into mysql,顯然CarService自動注入的CarDao使用了默認構(gòu)造函數(shù)構(gòu)造的實例。是否可以通過注解指定使用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;

avax.annotation.Resource注解實現(xiàn)的效果和@Autowired+@Qualifier的效果是一樣的。

總結(jié)

以上是生活随笔為你收集整理的JavaWeb-Spring中注解大全与详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。