参考:https://blog.csdn.net/qq_17586821/article/details/79803007
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呢?
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
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的区别,造成的尝试二的自动配置失败?于是尝试四
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
(将尝试三的
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)`
总结:
1:自动配置对前缀的要求:自动配置c3p0的dataSource,就应该使用spring.datasource
作为前缀(要想spring帮你做事,你怎么也得用spring.datasource来标记一下,表明这些参数是给spring看的吧)
3:自动配置对属性别名的要求:使用url
(Url)和username
(user-name,userName,user_name)等均可可,而jdbcurl
和user
不行。原因下面来解释。。
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
这个注解就是绑定配置文件中的信息到对象中的