■
Spring Framework总结点滴
关于Autowire自动注入的类
Spring虽然会对有下面这些注解的类进行自动扫描,
@Component,@Controller,@Repository,@Service
但如果不在SpringApplication类相同目录下,是扫描不到的,
因此需要指定扫描目录。
扫描几种方法
对Application类的@SpringBootApplication注解指定扫描目录,
这样在这个目录以及这个目录的子目录里面类都会被扫描
@SpringBootApplication(scanBasePackages = { "com.apibot" })
对Application类增加@ComponentScan注解指定扫描目录
Spring+Doma进行数据库连接
DataSource的使用
Spring项目的application.yml一般会有下面一段关于DB的定义
spring: datasource: url: jdbc:postgresql://localhost:5432/apibot driver-class-name: org.postgresql.Driver username: apibot password: apibot platform: postgresql
Spring框架的DataSourceProperties类里面有以下定义:
@ConfigurationProperties(prefix = "spring.datasource") public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
Spring框架会自动扫描spring.datasource的定义项
具体有哪些定义项可以使用,可以根据DataSourceProperties类的成员变量推断出来。
// --------------------------- // Doma用の設定 // --------------------------- @Autowired DataSourceProperties dataSourceProperties; //←自动注入DatasourceProperties DataSource realDataSource() { SimpleDataSource dataSource = new SimpleDataSource(); dataSource.setUrl(dataSourceProperties.getUrl()); dataSource.setUser(dataSourceProperties.getUsername()); dataSource.setPassword(dataSourceProperties.getPassword()); return dataSource; }
通过Autowired自动注入了datasourceProperties
生成一个SimplieDataSource类实例,从DataSourceProperites中取出DB连接所需要的参数,赋值给DataSource
在这个上面的例子中给url,user,password
@Bean DataSource dataSource() { /* TransactionAwareDataSourceProxyでラップしないとDomaのコネクションが Springの管理外になって実行時例外発生時にRollbackされない */ return new TransactionAwareDataSourceProxy( new Log4jdbcProxyDataSource( realDataSource())); }
@Bean的用法可以参考下方连接:
Doma的Transcation管理
Doma建立的DB连接,没有被TransactionAwareDataSourceProxy管理。
因此需要通过Wrapper,交给TransactionAwareDataSourceProxy管理。
也就是说,connection的建立,不是通过DataSource建立getconnection。
而是通过Log4jdbcProxyDataSource里的成员方法建立连接。
关于doma的连接需要进行Transaction管理一节,可以参考以下连接。
Warning
这是在测试环境下的,正式的生产环境还是用其他的jdbc。
@Bean Dialect dialect() { return new PostgresDialect(); } @Bean Config config() { return new Config() { @Override public DataSource getDataSource() { return dataSource(); } @Override public Dialect getDialect() { return dialect(); } @Override public SqlFileRepository getSqlFileRepository() { return sqlFileRepository(); } }; }
Dialect是DB的方言消除Class,通过使用这个Class可以消除DB之间关于SQL文的语法差异。
SqlFileRepository是存放SQL的位置,可以用来指定SQL的存放位置
以上为标准写法。可以customize。