bean 裏邊的註解

可在Java代碼中使用@Resource或者@Autowired註解進行裝配,但需在XML中配置以下信息
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
然後顯式的配置<context:annotation-config/>
該配置隱式註冊了多個對註解進行解析的處理器,如下列舉
AutowiredAnnotationBeanPostProcessor      CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor    RequiredAnnotationBeanPostProcessor

其實,註解本身做不了任何事情,和XML一樣,只起到配置的作用,主要在於背後強大的處理器

@Autowired是Spring提供的一種注入Bean的方法。
具體的應用是:
  1)在Service類中定義的注入屬性前加@Autowired。例如:@Autowired private PersonDAO personDAO,
  2)必須有個set方法,例如:
@Autowired
 public void setPersonDAO(PersonDAO personDAO) {
  System.out.println("********** @Autowired注入Bean *************");
  this.personDAO = personDAO;
 }
Spring配置文件的配置內容:
1) 頭部
 (加入)xmlns:context="http://www.springframework.org/schema/context" 
 (添加)xsi:schemaLocation="http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-2.5.xsd"
  2) 
<context:annotation-config/>
 <bean id="personDAO" class="edu.syict.dao.impl.PersonDAOImpl"/>
 <bean id="personService" class="edu.syict.service.impl.PersonServiceImpl"/>
這個註解就是spring可以自動幫你把bean裏面引用的對象的setter/getter方法省略,它會自動幫你set/get。
<bean id="userDao" class="..."/>
<bean id="userService" class="...">
    <property name="userDao">
      <ref bean="userDao"/>
    </property>
</bean>
這樣你在userService裏面要做一個userDao的setter/getter方法。
但如果你用了@Autowired的話,你只需要在UserService的實現類中聲明即可。
@Autowired
private IUserDao userdao;

@SuppressWarnings壓制警告,即去除警告 
rawtypes是說傳參時也要傳遞帶泛型的參數
J2SE 提供的最後一個批註是 @SuppressWarnings。該批註的作用是給編譯器一條指令,告訴它對被批註的代碼元素內部的某些警告保持靜默。 
@SuppressWarnings 批註允許您選擇性地取消特定代碼段(即,類或方法)中的警告。其中的想法是當您看到警告時,您將調查它,如果您確定它不是問題,您就可以添加一個 @SuppressWarnings 批註,以使您不會再看到警告。雖然它聽起來似乎會屏蔽潛在的錯誤,但實際上它將提高代碼安全性,因爲它將防止您對警告無動於衷 — 您看到的每一個警告都將值得注意。
取消警告表示,在編譯.java文件的時候,不在出現一些警告 ,如變量沒有用到,會有提示警告,用
@SuppressWarnings("unused")之後 ,警告消失。


另外,比較建議使用@Resource註解,而不要使用@Autowired註解
因爲@Autowired註解是Spring提供的,而@Resource註解是J2EE提供的
在JDK6中就已經包含@Resource註解了,所以它沒有跟Spring緊密耦合
並且在使用Spring時,若使用了JSR-250中的註解,如@Resource//@PostConstruct//@PreDestroy
那麼還需要Spring安裝目錄中的SPRING_HOME\\lib\\j2ee\\common-annotations.jar包的支持
這裏面的@Resource註解就是在SPRING_HOME\\lib\\j2ee\\common-annotations.jar中的

@Resource註解
@Resource註解和@Autowired一樣,也可以標註在字段或屬性的setter方法上
@Resource默認按名稱裝配,名稱可以通過name屬性指定。當找不到與名稱匹配的bean時,纔會按類型裝配
若註解標註在字段上且未指定name屬性,則默認取字段名作爲bean名稱尋找依賴對象
若註解標註在setter上且未指定name屬性,則默認取屬性名作爲bean名稱尋找依賴對象
如果沒有指定name屬性,並且按照默認的名稱仍找不到依賴對象時,它就會按類型匹配
但只要指定了name屬性,就只能按名稱裝配了

@Autowired註解
@Autowired默認是按類型裝配對象的,默認情況下它要求依賴對象必須存在
如果允許null值,可以設置它的required屬性爲FALSE,如@Autowired(required=false)
若想要按名稱裝配,可以結合@Qualifier註解一起使用,如@Autowired(required=false)  @Qualifier("personDaoBean")


另外

在一個稍大的項目中通常會有上百個組件,如果都使用XML的bean定義來配置組件的話
顯然會增加配置文件的體積,查找及維護也不方便
而Spring2.5就爲我們引入了組件自動掃描機制
它可以在classpath下尋找標註了@Service、@Repository、@Controller、@Component註解的類
並把這些類納入Spring容器中管理,它的作用和在XML中使用bean節點配置組件是一樣的
使用自動掃描機制,則需配置<context:component-scan base-package="com.jadyer"/>啓動自動掃描
其中base-package指定需要掃描的包,它會掃描指定包中的類和子包裏面類
@Service用於標註業務層組件
@Repository用於標註數據訪問組件,即DAO組件
@Controller用於標註控制層組件,如Struts中的Action
@Component泛指組件,當組件不要好歸類時,可以使用這個註解進行標註

1、可以使用諸如@Service("personDao")修改bean名稱,而它默認的是將首字母小寫的類名作爲<bean>名稱

之後就可以和在配置文件中聲明的Bean一樣使用了。
2、若要更改<bean>作用域的話,可以使用@Scope("prototype")註解來修改<bean>作用域
3、若想讓<bean>實例化之後去執行初始化方法,可以使用@PostConstruct標註在方法上
4、同樣@PreDestroy註解標註在方法上,可以用來指定<bean>銷燬時執行的方法
這裏的@PostConstruct是EJB3裏面用來初始化bean的註解,它也不是Spring中的註解
並且<context:component-scan base-package=""/>的背後註冊了很多用於解析註解的處理器
其中就包括了<context:annotation-config/>配置項裏面的註解所使用的處理器
所以配置了<context:component-scan base-package="">之後,便無需再配置<context:annotation-config>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章