1. spring.factories得放在META-INF目录下
配置多模块时,模块间涉及到引用,并且存在包不同的情况,以致在主模块中引用不到子模块的类,一般情况下都在启动类增加扫描子模块的包,但是这样不够解耦,所以我在子模块中加了config类,通过spring.factories去加载它,期间碰到问题,记录如下:
config类加上@configuration,启动的时候这个类是被加载进来的,但是我在这个类上加了@ComponentScan,@EntityScan,@EnableJpaRepositories这几个注解似乎没有生效(最初我想当然只要类执行了,上面的注解应该也同时执行。。实际情况似乎不这样),于是加了spring.factories,通过它来加载config类。最初直接把spring.factories放在resources下,导致没有加载成功,放到META-INF下就行了。需要说明的是为什么程序会去加载spring.factories,因为启动类里加了@EnableAutoConfiguration,它用@Import({AutoConfigurationImportSelector.class})去找META-INF/spring.factories,这是固定路径。
spring.factories:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.xx.xx.config.xxConfig
2. 启动时自动执行DDL,DML script
用JPA注解形式创建表,启动时根据下面设置创建或修改表结构。
#1:value="create-drop" 表示当JPA应用的时候自动创建表,在解应用的时候删除相应的表,这个在做测试的时候比较有用,但在开发过程中不这么用
#2:value="create"这个在每次应用启动的时候都会创建数据库表(会删除以前数据库里的数据。
#3:value="update" 这个属性的作用是:每次只会更新数据库表里的信息spring.jpa.properties.hibernate.hbm2ddl.auto=create
但是假如只修改部分表结构的话,也会导致其它表的数据被清除掉,所以需要在启动的时候把数据重新插入。所要做的就是在module的resources下放一个data.sql,内容Insert into语句,我看到书上和一些文章都漏了一点,没有给它加上执行script的开关,所以这样是不会执行的,需要在配置文件里加上下面一句:
spring.datasource.initialization-mode=always
然后 SpringBoot会默认加载了类路径下的schema.sql和data.sql脚本。
具体源码看DataSourceAutoConfiguration和DataSourceInitializer这两个类。
网友评论