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的配置类(AppConfig.java

// ---------------------------
//  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。