SpringBoot启动
SpringApplication.run(MyBootApplication.class);
SpringApplication.run启动SpringBoot应用,主要过程
- 要创建Spring容器对象
- 根据MyBootApplication注解标记功能创建Bean组件对象纳入Spring容器中(@SpringBootApplication)
- 如果是web程序,会自动启动Tomcat服务器,并将程序发布到服务器上
- 用户可以对SpringBoot程序访问
@SpringBootApplication作用
@SpringBootApplication注解是一个多功能标记,主要包含以下子标记功能:
查看源码得知:@SpringBootApplication 被 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解所修饰,换言之 Springboot 提供了统一的注解来替代以上三个注解,简化程序的配置。
-
@SpringBootConfiguration(@Configuration)
等价于Spring Boot Bean定义标记。<bean id="xxx"></bean>
来一个简单接口和实现类:
//接口 public interface IDeptDao { void save(); } //实现类 public class DeptDao implements IDeptDao { public void save(){ System.out.println("正在配置......."); } }
//@Configuration //两者意义相同,@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类, @SpringBootConfiguration //并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。 public class MyConfigurationBean { //@Primary //主对象,默认注入时采用的对象 @Bean//将当前的方法纳入到spring容器中,id默认为方法名 public IDeptDao deptdao() { IDeptDao dept = new DeptDao(); return dept; } @Bean(name="deptDao1")//将当前对象纳入到spring容器中,并指定名字 public IDeptDao deptDao() { IDeptDao dept = new DeptDao(); return dept; } }
测试:
public class TestConfigurationBean { // 实例化Spring Boot容器 public static void main(String[] args) { ApplicationContext app = SpringApplication.run(MyBootApplication.class, args); DeptService bean = app.getBean("deptService", DeptService.class); bean.addDept(); } }
//结果:
正在将数据加入到数据库中....
正在配置.......
-
@EnableAutoConfiguration
Spring Boot 自动配置标记。SpringBoot内置大量的自动配置组件,可以在启动时加载创建对象纳入Spring容器,例如dispatcherServlet、dataSource、jdbcTemplate等等。
加载原理:开启@EnableAutoConfiguration标记后,调用EnableAutoConfigurationImportSelector组件加载spring-boot-autoconfigure.jar包中META-INF/spring.factories文件,文件中定义了大量自动配置组件,载入Spring容器。
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,
-
@ComponentScan
SpringBoot 扫描标记.等价于<context:component-scan base-package="xx"/>
@ComponentScan(basePackages={"cn.xdl.service"})//等价于<context:component-scan base-package="xx"/>,指定文件夹 //@ComponentScan//扫描当前包及子包组件,一般需要将类放到根包中cn.xdl public class MyComponentScanBean { }
DeptService组件定义
@Service public class DeptService { public void addDept(){ System.out.println("添加一个部门信息"); } }
实例化Spring Boot容器:
public static void main(String[] args) { ApplicationContext ac = SpringApplication.run(MyBootApplication.class); DeptService deptService = ac.getBean("deptService",DeptService.class); System.out.println(deptService); deptService.addDept(); }
Properties配置参数注入
可以将application.properties文件中的参数注入给Spring容器中的Bean对象。
@Component//扫描 @ConfigurationProperties(prefix="spring.datasource")//配置参数注入 public class MyBean { private String myname;//与application.properties中key相同 private String mypassword; @Value("${db.url1}") private String url1; //省略set和get方法 }
@ConfigurationProperties指定将application.properties中同名参数给Bean对象属性注入,如果有key有共通前缀,可以使用prefix属性指定。如果遇到特殊key可以使用@Value标记注入。@ConfigurationProperties需要开启自动配置功能@EnableConfigurationProperties或@EnableAutoConfiguration。
SpringBoot内置dataSource机制
SpringBoot通过自动配置组件DataSourceAutoConfiguration,自动创建出DataSource对象,id名字为dataSource。创建过程如下:
- 首先创建tomcat-jdbc连接池对象(spring-boot-starter-jdbc包含有)
- 如果tomcat-jdbc创建失败,会查找创建Hikari连接池对象
- 如果Hikari创建失败,会查找创建commons-dbcp连接池对象
- 如果commons-dbcp创建失败,会查找创建commons-dbcp2连接池对象
提示:spring-boot-starter-jdbc在1.x版本中配套引入tomcat-jdbc连接池,但是在2.x版本中配套引入HikariCP连接池。
使用步骤如下:
-
创建maven project在pom.xml定义jdbc
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.7.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <!-- 含有dao、aop事务、连接池包(1.x tomcat/2.x HikariCP) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.3</version> </dependency> </dependencies>
-
在application.yml或properties追加连接参数定义
spring: datasource: username: SCOTT password: TIGER url: jdbc:oracle:thin:@localhost:1521:XE driverClassName: oracle.jdbc.OracleDriver
-
在启动类前开启自动配置功能
@SpringBootApplication public class MyBootApplication { }
-
测试类
public static void main(String[] args) { ApplicationContext ac = SpringApplication.run(MyBootApplication.class, args); DataSource ds = ac.getBean("dataSource",DataSource.class); System.out.println(ds); }
创建指定连接池方法(方法一,推荐)
在application.yml或properties追加下面参数
spring.datasource.type=org.apache.commons.dbcp.BasicDataSource
创建指定连接池方法(方法二)
使用@Configuration+@Bean自定义dataSource对象
@SpringBootApplication public class MyBootApplication { @ConfigurationProperties(prefix="spring.datasource") @Bean public DataSource dataSource(){ BasicDataSource ds = new BasicDataSource(); return ds; } }