注解的作用:spring容器是通過把java類注冊成bean進行管理的,把java類變成bean有兩種方式,一種是通過xml文件進行配置,把需要的類注冊成bean,
還有一種方式就是注解,注解的方式只需要在需要的類前邊加上注解,spring掃描到注解就能把被注解的類自動注冊成bean,不同的注解可以被注冊成不同的bean,
相對於xml配置,使用注解更為方便快捷。也因此越來越多的框架都支持注解配置而放棄xml配置。所以總得來說,注解的作用就是代替手動配置吧,只需要在適當的位置標注一下,就能讓框架自己完成具體的配置過程。
首先,在applicationContext.xml文件中加一行: <context:component-scan base-package="com.hzhi.clas"/> 加上這一行以后,將自動掃描路徑下面的包,如果一個類帶了@Service注解,將自動注冊到Spring容器,不需要再在applicationContext.xml文件定義bean了,類似的還包括@Component、@Repository、@Controller。 比如下面這個類: 復制代碼 @Service("courseDAO") @Scope("prototype") public class CourseDAOImpl extends HibernateDaoSupport implements CourseDAO{ ...... } 復制代碼 其作用就相當於applicationContext.xml文件里面的: <bean id="courseDAO" class="com.hzhi.course.dao.CourseDAOImpl" scope="prototype"> ...... </bean>

版權聲明:本文為博主原創文章,未經博主允許不得轉載。
很長時間沒做web項目都把以前學的那點框架知識忘光了,今天把以前做的一個項目翻出來看一下發現用·@Component標記一個組件,而網上有的用@Service標記組件,我暈就查了一下資料:
spring 2.5 中除了提供 @Component 注釋外,還定義了幾個擁有特殊語義的注釋,它們分別是:@Repository、@Service 和 @Controller。
在目前的 Spring 版本中,這 3 個注釋和 @Component 是等效的,但是從注釋類的命名上,很容易看出這 3 個注釋分別和持久層、業務層和控制層(Web 層)相對應。
雖然目前這3 個注釋和 @Component 相比沒有什么新意,但 Spring 將在以后的版本中為它們添加特殊的功能。
所以,如果 Web 應用程序采用了經典的三層分層結構的話,最好在持久層、業務層和控制層分別采用上述注解對分層中的類進行注釋。
@Service用於標注業務層組件
@Controller用於標注控制層組件(如struts中的action)
@Repository用於標注數據訪問組件,即DAO組件
@Component泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注。
- @Service
- public class VentorServiceImpl implements iVentorService {
- }
- @Repository
- public class VentorDaoImpl implements iVentorDao {
- }
在一個稍大的項目中,如果組件采用xml的bean定義來配置,顯然會增加配置文件的體積,查找以及維護起來也不太方便。
Spring2.5為我們引入了組件自動掃描機制,他在類路徑下尋找標注了上述注解的類,並把這些類納入進spring容器中管理。
它的作用和在xml文件中使用bean節點配置組件時一樣的。要使用自動掃描機制,我們需要打開以下配置信息:
代碼
- <?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-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd">
- <context:component-scan base-package=”com.eric.spring”>
- </beans>
1.component-scan標簽默認情況下自動掃描指定路徑下的包(含所有子包),將帶有@Component、@Repository、@Service、@Controller標簽的類自動注冊到spring容器。對標記了 Spring's @Required、@Autowired、JSR250's @PostConstruct、@PreDestroy、@Resource、JAX-WS's @WebServiceRef、EJB3's @EJB、JPA's @PersistenceContext、@PersistenceUnit等注解的類進行對應的操作使注解生效(包含了annotation-config標簽的作用)。
getBean的默認名稱是類名(頭字母小寫),如果想自定義,可以@Service(“aaaaa”)這樣來指定。
這種bean默認是“singleton”的,如果想改變,可以使用@Scope(“prototype”)來改變。
可以使用以下方式指定初始化方法和銷毀方法:
- @PostConstruct
- public void init() {
- }
- @PreDestroy
- public void destory() {
- }
注入方式:
把DAO實現類注入到action的service接口(注意不要是service的實現類)中,注入時不要new 這個注入的類,因為spring會自動注入,如果手動再new的話會出現錯誤,
然后屬性加上@Autowired后不需要getter()和setter()方法,Spring也會自動注入。
在接口前面標上@Autowired注釋使得接口可以被容器注入,如:
- @Autowired
- @Qualifier("chinese")
- private Man man;
當接口存在兩個實現類的時候必須使用@Qualifier指定注入哪個實現類,否則可以省略,只寫@Autowired。
用@Resource注解完成屬性裝配
使用Field注入(用於注解方式):注入依賴對象可以采用手工裝配或者手工自動裝配。在實際應用中建議使用手工裝配,因為自動裝配會產生未知情況,開發人員無法預見最終的裝配結果。
依賴注入—手工裝配
手工裝配依賴對象,在這種方式中又有兩種編程方式。
1.在xml配置文件中,通過bean節點配置,如:
1 <bean id="orderService" class="cn.itcast.service.OrderServiceBean"> 2 //構造器注入 3 <constructor-arg index="0" type="java.lang.String" value="xxx"/> 4 //屬setter方法注入 5 <property name="name" value="zhao"/> 6 </bean>
2.在java代碼中使用@Autowired或者@Resource注解方式進行裝配。但我們需要在xml配置文件中配置一下信息
1 <beans Xmlns="http://www.springframework.org/schema/beans" 2 Xmlns="http://www.w3.org/2001/XMLSchema-instance" 3 Xmlns:context="http://www.springframework.org/schema/context" 4 Xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/context 6 http://www.springframework.org/schema/context/spring-context-2.5xsd"> 7 </beans>
這個配置隱式注冊了多個對注釋進行解析處理的處理器:AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanProcessor,RequiredAnnotationBeanPostProcessor
3.區別
在java代碼中使用@Autowired或@Resource注解方式進行裝配。這兩個注解的區別是@Autowired默認按類型裝配@Resource默認按名稱進行裝配,當找不到與名稱匹配的bean才會按類型裝配
1 @Autowired 2 private PersonDao personDao;//用於字段上 3 @Autowired 4 public void setOrderDao(OrderDao orderDao){ 5 this.orderDao = orderDao; //用於屬性的setter方法上 6 }
@Autowired注解是按類型裝配依賴對象,默認情況下它要求依賴對象必須存在,如果允許null值,可以設置它required屬性為false;如果我們想使用名稱裝配,可以結合@Qualfier注解一起使用,如下:
@Autowired@Qualifier("personDao") private PersonDao personDao;
@Resource注解和@Autowired一樣,可以標注在字段或者屬性的setter方法上,但它默認按名稱裝配。名稱可以通過@Resource的name屬性指定;如果沒有指定name屬性,當注解標注在字段上,即默認字段的名稱作為bean名稱尋找依賴對象;當注解標注在屬性setter方法上,即默認取屬性名作為bean名稱尋找依賴對象
@Resource(name="personDaoBean") private PersonDao personDao;
注:如果沒有指定name屬性,並且按照默認的名稱仍找不到對象時,@Resource注解會回退到按類型裝配。但一旦指定了name屬性,就只能按名稱裝配了。
1、@Autowired與@Resource都可以用來裝配bean. 都可以寫在字段上,或寫在setter方法上。
2、@Autowired默認按類型裝配(這個注解是屬業spring的),默認情況下必須要求依賴對象必須存在,如果要允許null 值,可以設置它的required屬性為false,如:@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier注解進行使用,如下:
- @Autowired() @Qualifier("baseDao")
- private BaseDao baseDao;
3、@Resource(這個注解屬於J2EE的),默認安照名稱進行裝配,名稱可以通過name屬性進行指定,
如果沒有指定name屬性,當注解寫在字段上時,默認取字段名進行按照名稱查找,如果注解寫在setter方法上默認取屬性名進行裝配。 當找不到與名稱匹配的bean時才按照類型進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。
- @Resource(name="baseDao")
- private BaseDao baseDao;
我喜歡用 @Resource注解在字段上,且這個注解是屬於J2EE的,減少了與spring的耦合。最重要的這樣代碼看起就比較優雅。
。。。。。。。。。。。。。。。。。。。。。。。。。。。
什么時候用@Resource,什么時候用@service
Spring中什么時候用@Resource,什么時候用@service
當你需要定義某個類為一個bean,則在這個類的類名前一行使用@Service("XXX"),就相當於講這個類定義為一個bean,bean名稱為XXX;
當需要在某個類中定義一個屬性,並且該屬性是一個已存在的bean,要為該屬性賦值或注入時在該屬性上一行使用@Resource(name="xxx"),相當於為該屬性注入一個名稱為xxx的bean。
===================================================================================================
Spring不但支持自己定義的@Autowired注解,還支持幾個由JSR-250規范定義的注解,它們分別是@Resource、@PostConstruct以及@PreDestroy。
@Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource默認按 byName自動注入罷了。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。
@Resource裝配順序
1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常
2. 如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常
3. 如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常
4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始類型進行匹配,如果匹配則自動裝配;
@RequestMapping():為控制器類或者方法指定一個映射的路徑,也就是說控制器類或者方法所對應的url,之后就可以通過@RequestMapping()注解指定的路徑來訪問到對應的類或方法。使用格式是:
@RequestMapping(value=”/login”)
一般來說,/后邊的值保持和類或者方法同名,當然用別的名字也可以。@RequestMapping()還支持使用參數method限定被請求的方式,例如:
@RequestMapping(value="/getName", method = RequestMethod.GET)
, @Controller
用來標記控制類
2, @RequestMapping()
用來標記在controller類上或者方法上,做地址映射
3, @Autowired
注釋在成員變量上spring就會將其以Byname的形式自動化注入到spring容器中,因此便省去了get/set方法和spring配置文件的配置
4, @Service
標記業務邏輯層Bean
5, @Resource
這個注解不屬於spring,是J2EE的注解;注解與@Autowried的使用方法一樣,但是建議使用@Resource。
@Resource與@Autowried的不同就是@Autowried是是通過Bytype的方式注入spring的,而@Resource是通過Byname或Bytype方式注入spring的。@Resource有兩個重要的屬性分別是name和type,spring將屬性name解析為bean的名字,而將type屬性解析成bean的類型。如果使用name屬性就是使用Byname自動注入策略,如果使用type屬性就是使用Bytype自動修護乳策略,如果即不指定name也不指定type,那么spring就通過反射機制使用Byname自動注入策略。如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常 如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常 如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配(見2);如果沒有匹配,則回退為一個原始類型(UserDao)進行匹配,如果匹配則自動裝配;
6,@Transational
標記該方法是事務執行的;
7,@Repository
標記數據訪問層Bean
Spring系列之Spring常用注解總結
https://www.cnblogs.com/xiaoxi/p/5935009.html