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事務資料?六種事務模型與四種事務隔離級別介紹。

          posted on 2010-12-21 17:34 hello 閱讀(249) 評論(0)  編輯  收藏 所屬分類: springside
          主站蜘蛛池模板: 乌审旗| 湘西| 顺平县| 涪陵区| 玛纳斯县| 林西县| 洛南县| 濉溪县| 绥芬河市| 来安县| 宜兴市| 澄江县| 将乐县| 龙里县| 乐亭县| 德阳市| 金山区| 青神县| 大新县| 澄城县| 开原市| 上林县| 香港 | 民丰县| 乐东| 绥化市| 江油市| 施秉县| 桃园市| 德惠市| 新津县| 六枝特区| 油尖旺区| 育儿| 荔波县| 汝城县| 建瓯市| 连山| 无锡市| 海阳市| 尼勒克县|