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模板中的變量作為參數。