由於專案的需要spring的業務相關的bean不是寫在xml檔案中,因為專案是乙個模組乙個模組提交的,提交的時候不想修改xml檔案,因此就用到了spring的註解service。
例如:
@service("testservice")
public class testservice
這等同於:
spring會在classpath裡面掃瞄標記有testservice等標籤的類,掃瞄元件的配置如下:
加上以上的配置後,spring會自動的掃瞄org.sdp檔案下的標記有注釋的類。
以上的配置看似很「完美」,其實如果專案稍微大時就會出現問題,大家都知道spring的bean的id必須唯一,如果兩個人同事寫**就有可以造成寫同樣的bean名稱。
解決這個問題的乙個思路是把bean的名稱修改為 類的全路徑,例如org.sdp.a 和com.bey.a 。
只要修改spring預設的bean命名策略就可以了。
annotationbeannamegenerator是bean的預設命名策略,他實現了beannamegenerator
介面。在service裡面,如果不寫bean的名稱,那麼預設的名曾是類名,但是第乙個字母是小寫的。
例如:
com.xyz.fooserviceimpl -> fooserviceimpl
觀察spring的源**發現,builddefaultbeanname方法首先了bean名稱小寫的作用。
protected string builddefaultbeanname(beandefinition definition)
因此,可以寫乙個類繼承自annotationbeannamegenerator,重寫builddefaultbeanname方法。
public class sdpannotationbeannamegenerator extends annotationbeannamegenerator
}
在掃瞄配置中需要新增自己的命名策略類:
如果是spring2.5則就結束了,但是spring3.0為完美提供了getbean(name,requiredtype);使用了泛型,因此只要傳入乙個業務類的class,getbean就返回此類的例項,而不用在
強制轉換型別了。
public static t getservice(string classfullname) throws classnotfoundexception,bean***ception
強制轉換型別**:
testservice testservice2=(testservice ) sdpcontext.getcontext().getbean("testservice ");
system.out.println(testservice2);
改進後的**:
@service
public class testservice
testservice testservice=sdpcontext.getservice("org.sdp.context.testservice");
system.out.println(testservice);
spring註解定義bean
1 利用註解宣告該類 component student id名為 student public class student2 配置掃瞄器 xmlns context 掃瞄某包 多個包用逗號分隔 執行流程 spring在啟動的時候,會根據base package在 該包中掃瞄所有類,查詢這些類是否有...
Spring 自定義註解案例
1.自定義時間格式註解 target elementtype.field 作用於字段上 retention retentionpolicy.runtime 保留到執行期 public inte ce dateparse2.自定義資料字典註解 target elementtype.field 作用於字...
spring中使用自定義註解
使用spring時,aop可以大幅度減少我們的工作量,這裡主要介紹一些spring中aop如何切註解。自定義註解 target retention retentionpolicy.runtime public inte ce myannotation 編寫切面類,切點在自定義註解上,切面類新增到sp...