前久看了一篇文章,
http://www.iteye.com/topic/315257
里面说
由于目前还无法解决 osgi 环境下的 aspectj 问题 , 所以 , 处理事务无法使用 tx:advice 和 aop:config, 改用 DataSourceTransactionManager.
后又看了一篇文章页是他的,说Equinox Aspects可以解决这个问题。
于是去看了看,现在问题已经解决了。
以下我把我的例子的整个流程写一下。
一.jar包的准备,我用的是eclipse环境
1).首先去 http://download.eclipse.org/equinox/ 下载
equinox-SDK 这里我用的3.4的 配置事务的 3.5好像有问题。
2).去 http://www.springsource.org/osgi 下载
spring-osgi-1.2.0-rc1.zip
spring-osgi-1.2.0-rc1-with-dependencies.zip
3).去 http://www.springsource.org/download 下载
spring-framework-2.5.6.zip
spring-framework-2.5.6-with-dependencies.zip
4).去 http://www.eclipse.org/aspectj/downloads.php 下载
aspectj-1.6.1.jar
5).去 http://www.eclipse.org/equinox/incubator/aspects/equinox-aspects-quick-start.php 下载
org.eclipse.equinox.weaving-incubation-1.0.0.200807082136-archive.zip
下载好了就先解压吧。
二.配置eclipse的环境
首先,我们建一个环境项目,里面放jar包就可以了。
File->NewProject 选general->project 起个名字,我的是myTargetPlatform2。在这个项目里面建立一个目录,目录名是 target
在target里放入用到的包:
spring-osgi要用到的包
spring-osgi-annotation-1.2.0-rc1.jar
spring-osgi-core-1.2.0-rc1.jar
spring-osgi-extender-1.2.0-rc1.jar
spring-osgi-io-1.2.0-rc1.jar
spring-osgi依赖包里的
com.springsource.net.sf.cglib-2.1.3.jar
com.springsource.org.aopalliance-1.0.0.jar
spring的包
spring.jar
这里是运行要用到的包
org.eclipse.osgi_3.4.0.v20080605-1900.jar
这个是Equinox Aspects的
org.eclipse.equinox.weaving.aspectj_1.0.0.200807082136.jar
org.eclipse.equinox.weaving.caching_1.0.0.200807082136.jar
org.eclipse.equinox.weaving.caching.j9_1.0.0.200807082136.jar
org.eclipse.equinox.weaving.hook_1.0.0.200807082136.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
放好后,window->preferences plug-in Development->Target Platform 点一下。
这时旁边有add点一下,直接点next,点add,这时可以选路径,选择前边项目的里的target目录,同时设置一下Name。选定你建立好的平台(黑体是选定)。可以了。
三.建立项目。这里不说了,我把项目上传,自己导入一下吧。
org.aspectj.runtime
org.aspectj.weaver
分别是aspectj-1.6.1.jar包里的2个jar。
我没用ibatis,读取配置好像有问题,
我的spring是bundle的方式加载的,ibatis包是在dao实现的项目里classpath加载的,是读取不到ibatis的配置,看网上说是classloader的问题,希望高手能给解决一下。
这里事务用的标签式的事务。在实现类里配置的。
启动,下边有图是用到的包。
com.myTest.service.daoJdbcImpl 项目下有数据库配置要改一下。
数据库测试表结构
DROP TABLE IF EXISTS `mytest_user`;
CREATE TABLE `mytest_user` (
`id` bigint(20) NOT NULL auto_increment,
`name` varchar(100) NOT NULL,
`sex` tinyint(1) default 0,
`address` varchar(255) default '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在实现类的事务标签那里修改一下,改为
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
忘记加事务回滚的,不过我测试不加也回滚了。下边有个文章介绍事务的
http://www.ibm.com/developerworks/cn/java/j-ts1.html?ca=drs-tp4608
跨bundle的事务的测试代码也写好了,有兴趣的可以下载跑一下。spring-osgiTest2.rar
做了一个简单quartz的bundle,使整体不依赖quartz包,bundle的启动,停止都会启动停止任务。spring-osgiTest3.rar
做了一个简单的拦截器测试,不知道为什么在spring dm中 <aop:aspectj-autoproxy proxy-target-class="true"/>老是报错,又是classloader的问题,就改了一下方法。看官方的例子在osgi中他用的aj文件,aop.xml的配置文件,加vm参数做的。还看了文章用spring管理,在配置bean加factory-method="aspectOf" 属性。于是写了一个测试,大家可以下载测试一些。
还加入了service相互依赖调用的例子。配置文件有注释。可以看一下。 文件 20100202.rar