spring数据源配置,application.properties文件到底该怎么写

参考:https://blog.csdn.net/qq_17586821/article/details/79803007

尝试一:手动配置dataSource,成功

application.properties

c3p0.jdbcurl=jdbc:mysql://localhost/student_system
c3p0.user=root
c3p0.password=******
#c3p0.driveClass=com.mysql.jdbc.Driver  不写也可自动加载驱动

启动类

@SpringBootApplication
public class SpringJdbcApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringJdbcApplication.class, args);
    }

    @Bean
    @ConfigurationProperties("c3p0")
    public DataSource c3p0DataSource() throws Exception {
        return DataSourceBuilder.create().type(ComboPooledDataSource.class).build();
    }

测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringJdbcApplicationTests {

    @Autowired
    DataSource dataSource;
    @Test
    public void contextLoads() throws Exception{
        System.out.println(dataSource.getClass().getName());
            int i = dataSource.getConnection().createStatement().executeUpdate("insert into student (stuName) VALUES ('yz')");
        System.out.println(i);
    }
}

打印结果 :1

总结1:手动配置c3p0—dataSource成功,但是伟大的springboot的核心特性就是自动配置啊?为什么我要自己去配置dataSource呢?

尝试二 (与尝试一唯一的区别就是不在启动类中手动配置dataSource,想验证springboot是否会自动配置dataSource,失败)*

application.properties*

c3p0.jdbcurl=jdbc:mysql://localhost/student_system
c3p0.user=root
c3p0.password=*****
#c3p0.driveClass=com.mysql.jdbc.Driver  不写也可自动加载驱动``

启动类

@SpringBootApplication
public class SpringJdbcApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringJdbcApplication.class, args);
    }
}

测试类同尝试一·

打印结果:
项目启动失败,无法为dataSource注入bean

.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource 

尝试三(依然试图让springboot帮忙自动配置dataSource的bean,修改尝试二的properties文件为spring通过ide推荐的格式,又成功了)

application.properties

spring.datasource.url=jdbc:mysql://localhost/student_system
spring.datasource.username=root
spring.datasource.password=******
#必须,告诉spring你要的dataSource类型,否则spring会配置官方支持的tomcat,hikari,dbcp,dbcp2的dataSource
spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver

启动类

@SpringBootApplication
public class SpringJdbcApplication {
	public static void main(String[] args) {
    	SpringApplication.run(SpringJdbcApplication.class, args);
	}
}

测试类同尝试一
打印结果 :1

总结1:自动配置c3p0—dataSource成功,导致失转成功的原因可能是properties文件中的
差异造成
1前缀不同 :由c3p0变成了spring.datasource
2别名不同 :由jdbcurl变成了url,由user变成了username,还加了spring.datasource.type属性

#尝试二的:
   c3p0.jdbcurl=jdbc:mysql://localhost/student_system
   c3p0.user=root


#尝试三的·-
    spring.datasource.url=jdbc:mysql://localhost/student_system
    spring.datasource.username=root
    spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource

难道是 url和jdbcurl,user和username的区别,造成的尝试二的自动配置失败?于是尝试四

*尝试四 (将尝试三的前缀spring.datasource改成c3p0。 即改前缀,保别名。又不行了,说明前缀必须是spring.datasource)

application.properties*

c3p0.url=jdbc:mysql://localhost/student_system
c3p0.username=root
c3p0.password=*****
c3p0.type=com.mchange.v2.c3p0.ComboPooledDataSource
#c3p0.driveClass=com.mysql.jdbc.Driver  不写也可自动加载驱动``
	打印结果:启动失败,无法自动配置dataSource

尝试五:(将尝试三的前缀保留,修改别名url为jdbcurl,或者修改别名username为user。即保前缀,改别名。两种情况均失败了,这就说明别名必须是url和username,这也是ide推荐的别名)

(将尝试三的
spring.datasource.url改为
spring.datasource.jdbcurl
打印结果:

`Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.`

spring.datasource.username改为
spring.datasource.user
打印结果:

   java.sql.SQLException: Access denied for user ''@'localhost' (using password: YES)`

尝试六:换用druid数据源,上述尝试中的现象依然存在。

总结:
1:自动配置对前缀的要求:自动配置c3p0的dataSource,就应该使用spring.datasource作为前缀(要想spring帮你做事,你怎么也得用spring.datasource来标记一下,表明这些参数是给spring看的吧)

3:自动配置对属性别名的要求:使用url(Url)和username(user-name,userName,user_name)等均可可,而jdbcurluser不行。原因下面来解释。。

2:手动配置:前缀是什么都可以,关键是要在配置类中使用@ConfigurationProperties(prefix="c3p0")来表明需要用这些以c3p0这个作为前缀的参数来创建dataSource

下面来解释为什么自动配置要使用spring.datasource作为前缀

@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@EnableConfigurationProperties({DataSourceProperties.class})
@Import({DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class})
public class DataSourceAutoConfiguration {
*******
}

首先在DataSourceAutoConfiguration类中,有一个注解@EnableConfigurationProperties({DataSourceProperties.class})
这个注解的意思是启用属性配置,参数是一个类对象,不明觉厉,找到这个参数类,如下:

@ConfigurationProperties(
    prefix = "spring.datasource"
)
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {

******
}

在这里似乎有点东西了,又见到prefix="spring.datasource"了,

@ConfigurationProperties( prefix = "spring.datasource")

表示这是一个属性配置类,其作用就是将application.properties文件中以spring.datasoure作为前缀的参数,封装进该类的对象的属性中。

但是仅仅加上@ConfigurationProperties,spring并不会实例化该类,

配合@EnableConfigurationProperties({DataSourceProperties.class})+@Configuration,就可以实例化该类并注册到spring容器里去,简之,@EnableConfigurationProperties这个注解就是实例化对象的,所以可以用@Component或者@Configuraton来达到同样的效果。而@ConfigurationProperties这个注解就是绑定配置文件中的信息到对象中的

你可能感兴趣的:(spring数据源配置,application.properties文件到底该怎么写)