spring 、jpa、classpath几个注意的地方

1.首先说说spring 与 jpa的问题,现在想买都习惯使用maven来管理,实现分子模块,每个子模块中都自己模块的实体类,每个实体类上使用@Entity进行注解,使其能将该实体自动扫描让jpa来映射管理。但是问题出现,运气好 有部分实体能被映射成功,运气不好一个实体也不能被映射成功。经过实验,发现:persistence.xml 所在的子模块的实体类能被映射,除此之外的都不行,解决办法:不得不放弃 全注解,多配一个,将需要映射的实体类通过配置文件进行加载。当然还有其其它解决方法,如使用:

2.再说说web项目中加入spring后,web.xml中的配置。

我之前在一篇文章张中说过:

applicationContext.xml 配置文件的存放位置

web.xml中classpath:和classpath*:  有什么区别? 
classpath:只会到你的class路径中查找找文件; 
classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找.

上确实是对的。

现在遇到的问题是:

还是maven项目中,一个项目被分成了多个子模块,每个子模块又有各自的applicationContext.xml配置文件,比如:

持久层(子模块):applicationContext-db.xml、applicationContext-mdb.xml

缓存层(子模块):applicationContext-cache.xml

控制层(子模块):applicationContext.xml、applicationContext-task.xml

等..  

然后我们在web.xml 配置如下:


	contextConfigLocation
	classpath*:applicationContext*.xml


上面的意思是:把当前classpath和jar中的classpath中以applicationContext开头的xml文件都加载进来作为spring的配置文件,但经过测试:发现只有控制层的applicationContext.xml、applicationContext-task.xml这两个配置文件成功了,其它模块的都没有加载进来。

那是什么原因呢,猜测classpath* 的*没有生效?还是applicationContext*.xml的* 没有生效,但是加载进来了 applicationContext-task.xml 文件呀,说明后者是生效了的。经过慢慢的测试终于找到了问题发生的现象,当使用classpath*时,后面的文件路径就不能带有通配符。spring去扫描jar里面的文件时,不会吧* 当成 任意字符处理的。只有使用classpath时,spring才会把文件路径中的*解析为任意字符。问题找到了,下来就来看解决办法。

首先修改web.xml 


	contextConfigLocation
	classpath:applicationContext*.xml,classpath*:applicationContext.xml


上面的意思是:

加载当前类路径下的 所有已applicationContext开头的xml  , 同时加载所有jar(子模块)中的applicationContext.xml文件。

但这个配置还是没有满足我们的要求,因为子模块中 还有 applicationContext-db.xml 、applicationContext-cache.xml 等 类似的没有加载进来。

解决办法是 在对应的子模块中,增加一个 applicationContext.xml 文件(因为,根据web.xml中的配置,spring能加载每个子模块的applicationContext.xml 文件,)。然后再各个子模块中的applicationContext.xml 文件中使用 将当期子模块的其他配置文件加载进来即可。

如:




	
	

你可能感兴趣的:(Java,后端,classpath,jpa,spring)