1. IOC Annotations
1.1 零配置使用場合
?? IOC? Annotations 可以實現零配置,但也因為不用在applicationContext.xml中定義了,也就缺乏了靈活的,不修改代碼的IOC手段,也無法做一些屬性值的配置。
?? 所以,IOC annotation 常用于Service,Dao,Controller 這些依賴關系比較固定,約定俗成大于配置的地方。
?? 而XML 配置文件則用于如Database/SessionFactory,Spring? Security這些需要配置的地方。
1.2 ApplicationContext.xml 定義
定義自動掃描Classpath路徑,掃描帶有@Component/@Service/@Repository的pojo加入applicationContext,并根據@Autoired/@Qualifier? 與 @Resource進行IOC配置,并對@PostConstruct 和 @PreDestroy和@Requried進行處理
<context:component-scan base-package="org.springside.examples.miniweb" />
?? 以下配置除不會掃描@Component/@Service/@Repository外,其他作用同上
?<context:annotation-config />
1.2 @Component/@Service 和 @Repository
? ? Spring掃描指定的classpath時,會含以上Annotation的類將加其加入ApplicaitonContext中。
??? 一般@Repository用于DAO層, 而@Service層用于Service層,@Component用于其他,三者在Spring當前版本并沒有本質區別,建議只使用@Component。
1.3 @Autoired/@Qualifier? 與 @Resource
? @Autoried 與 @Resource都比較靈活,不只能聲明于setter函數,還能聲明于不按setter規則命名的函數上,以及私有屬性上(不建議使用,因為在單元測試時需要以反射注入)
? @Autoried 默認byType,如果需要byName,在變量上增加@Qualifier,另外@Autoried默認隱含了@Required,保證變量一定被注入,如果不需要,用@Autowired(required=false)取消。
? @Resource 默認byName,如果name找不到就會byType, 另可以用name與type屬性設定。
1.4 @Requried
??? 對于非@autowired標注的屬性,聲明@Required表明明屬性必須被注入。
1.5 生命周期Annotation
- JSR250的@PostConstruct 和 @PreDestroy,比以往的實現接口或者在applicationContext.xml中配置init-method的方式更為方便和標準。
- {{@PostContruct在所有注入函數執行完畢后執行,而@PreDestroy則在JVM退出的ShutdonwHook中攔截,注意,ShutdownHook對kill -9這種暴烈的關閉無效。
}}
2.屬性文件
???? 在配置文件中,很有一些屬性會在團隊的開發環境,個人的開發環境,集成測試環境,生產環境,甚至生產環境集群的每臺服務器中都有所不同的。 ? ? ? 為了將這些易變的屬性抽從applicationContext取出來,Spring 做了一些特殊的支持,
???? 詳見Configuring applications with Spring,在SpringSide里配置如下:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> <property name="ignoreResourceNotFound" value="true" /> <property name="locations"> <list> <value>classpath:application.properties</value> <value>classpath:application.local.properties</value> <value>file:/var/myapp/application.server.properties</value> </list> </property> </bean>
? 團隊公用的開發環境配置在application.properties中,放入版本控制系統管理中。
? 個人的開發環境,集成測試環境中與公共環境不相同的部分,放入application.local.properties中,會覆蓋application.properties中的設置,由個人管理,不放入版本管理系統。
? 在打包部署到生產環境時,可將生產環境每臺服務器的特殊屬性可放在服務器的某個固定目錄,如/var/myapplicaiton/application.server.properties中(而不放在項目jar內),?? 每臺服務器的配置文件分開不同服務器目錄放在版本管理系統中。也可以在啟動命令中加入參數來覆蓋,如-Djdbc.username=aaa。
?3. 事務
??? 因為不喜歡在配置文件里用AspectJ定義事務,寧愿使用Spring的@Transactional annotation在service層上進行標注。
??? 對于只讀的方法,可以加入@Transactional (readOnly=true) 標注以提高性能。
??? 因為Spring默認只對RuntimeException進行rollback,所以:
??? 1.所有在service層方法中用throws定義的checkedException,都必須在@Transactional中定義rollbackclass。
??? 2.所有在service層方法中catch處理了的Exception,又希望Spring輔助rollback的話,必須重拋一個RunTimeException,SpringSide里預定義了一個統一的ServiceException。
?? 可特別配置事務類型,見
?? JavaEE事務資料?六種事務模型與四種事務隔離級別介紹。