简介
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。Boot在开发中实现免XML配置效果,使得程序员精力集中在编码实现上,可以快速构建Spring应用。
Spring Boot不是提供一种新的解决方案,是在Spring框架基础之上实现快速开发应用。
Spring Boot主要内容(一律采用Java注解配置):
- Spring Boot Beans和参数注入(IOC)
- Spring Boot 数据访问
- Spring Boot WebMVC
- Spring Boot AOP/事务
- Spring Boot Servlet应用
Spring Cloud使用
- 服务注册
- 服务发现
- 服务调用
搭建Spring Boot开发环境
导入boot jar开发包
基础包:spring-boot-starter-parent
添加boot 配置文件application.properties
spring.datasource.username=ZXH spring.datasource.password=123456
或application.yml
spring: datasource: username: ZXH password: 123456
创建spring boot项目
- 使用start.spring.io网址创建maven project,然后导入eclipse
使用eclipse创建maven project,然后在pom.xml中添加jar包,追加application.properties
<!-- boot基础包,指定了版本后,其他boot包可以省略版本号 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!-- 定义jdk版本和源码文件和编译后文件的编码 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.7</java.version> </properties> <dependencies> <!-- 核心自动配置,也就是ioc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- boot和junit集合的测试类 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
编写一个入门示例
1.### Hello入门示例(JSON响应)
- 在pom.xml引入一个spring-boot-starter-web开发包
<!-- Spring Boot WebMVC支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 在src/main/java中编写HelloController,使用@RestController+@RequestMapping
@RestController
public class HelloController {
@RequestMapping("/hello")
public String home(){
return "hello";
}
}
- 启动SpringbootApplication.java程序入口
- 打开浏览器访问http://localhost:8080/hello
- 如果需要修改默认8080端口号,可以在application.properties中添加
server.port=8888
上面示例使用注意事项
pom.xml配置中使用< scope>
指定jar包在什么情况下有效,默认compile表示编译、运行、测试、打包都有效;test表示只有运行测试类有效(junit类)
启动类SpringApplication.run()方法
参数需要使用当前类名做参数(带有@SpringBootApplication标记的类名)。
Controller类要放在启动类包中或子包中才能有效扫描
Hello入门示例(JSP响应)
在pom.xml引入JSP支持的jar包
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency>
在application.properties配置文件指定jsp位置
spring.mvc.view.prefix=/ spring.mvc.view.suffix=.jsp
编写Controller,使用@Controller+@RequestMapping
@Controller//jsp响应 public class JspController { @RequestMapping("/jsp") public String execute(ModelMap model){ model.put("msg", "你好,Spring Boot"); return "home";//调用/home.jsp } }
Spring Boot beans和参数注入(IOC)
常用标记
- @Configuration+@Bean
- @ComponentScan
- @EnableAutoConfiguration
- @SpringBootApplication
@Configuration+@Bean
Spring原有XML配置
<beans> <bean id="dbcp" class="..BasicDataSource"> </beans>
@Configuration等价于< beans>作用;@Bean等价于< bean>
注解替代方式
@Configuration//<beans> public class BeanFactory { //<bean id="dbcp" class="...MyDataSource"> // @Bean //默认约定是方法名做id值createDataSource @Bean(name="dbcp") public MyDataSource createDataSource(){ return new MyDataSource(); } @Bean public User createUser(){ User user = new User(); user.setId(10); user.setName("SpringBoot"); return user; } }
创建Spring容器获取bean对象
public static void main(String[] args){ //创建Spring容器对象 ApplicationContext ac = new AnnotationConfigApplicationContext(BeanFactory.class); MyDataSource ds = ac.getBean("dbcp",MyDataSource.class); System.out.println(ds); ds.getConnection(); //取user User user = ac.getBean("createUser",User.class); System.out.println(user.getId()+" "+user.getName()); }
@ComponentScan
开启组件扫描,等价于XML中,扫描包下组件,发现@Controller、@Service、@Repository、@Component会将组件纳入Spring容器创建对象
@ComponentScan(basePackages={“xxx”,”xxx”})
示例:
//<context:component-scan basePackage="xyz.ahong.dao"/> @ComponentScan(basePackages={"xyz.ahong.dao"})
UserDao组件在cn.xdl.dao包下
@Repository//默认约定是类名首字母小写userDao public class UserDao { @Resource private MyDataSource dataSource; public void findUser(){ System.out.println(dataSource+"查询User信息"); } }
@EnableAutoConfiguration
从Spring3开始为了摆脱XML配置,提供一系列的@Enablexxx注解,例如EnableConfigProperties、EnableWebMVC、EnableTrantactionManager等等
利用那些Enable注解替代原来Spring XML配置文件中的、等定义。@EnableAutoConfiguration标记包含了所有EnableXxx注解标记,追加了该标记等价于把所有EnableXxx注解功能打开。
@EnableAutoConfiguration标记内部使用SpringFactoriesLoader组件加载了所有jar包中的”META-INF/spring.factories”文件中定义的组件。
在spring-boot-autoconfigure-1.4.2.RELEASE.jar包下的spring.factories包含以下组件,可以开启的自动配置功能如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration org.springframework.boot.autoconfigure.aop.AopAutoConfiguration org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration ... ...省略
@SpringBootApplication
@SpringBootApplication标记包含@Configuration、@ComponentScan和@EncableAutoConfiguration。
写一个等价于写上述3个。@EnableConfigurationProperties和@ConfigurationProperties
@EnableConfigurationProperties属于自动装配功能之一,包含在@EncableAutoConfiguration中。
作用是可以将application.properties信息注入到实体对象属性中。
@ConfigurationProperties需要使用@EnableConfigurationProperties
使用方法请看下面案例:
application.properties代码如下:
db.mysql.username=root db.mysql.password=123456 db.oracle.username=ZXH db.oracle.password=123456
DbConfig实体对象类结构如下:
@Component @ConfigurationProperties(prefix="db.oracle") public class DbConfig { private String username;//获取application.properties中prefix.username值 private String password; @Value("${db.username}") private String user;//将db.username=xdl信息给user属性 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
创建Spring容器对象,获取dbConfig对象测试
ApplicationContext ac = SpringApplication.run(BeanFactory.class); DbConfig dbconfig = ac.getBean("dbConfig",DbConfig.class); System.out.println(dbconfig.getUsername()+" "+dbconfig.getPassword());
注意:自动装配属于boot功能,AnnotationConfigApplicationContext创建Spring容器对象不支持此功能。
Spring Boot测试
和junit4集合,启动时创建Spring容器,然后将测试类对象和原有的Bean对象结合在一起,最后可以将Bean对象给测试属性注入.
@RunWith(SpringRunner.class)//@Runwith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes={BeanFactory.class})//@ContextConfiguration(locations={"spring-mvc.xml"}) public class TestBootJunit { @Resource private MyDataSource ds; @Test public void test1(){ //测试代码 System.out.println(ds); ds.getConnection(); } }
springboot应用程序结构建议
包名要有层次,一般采用域名反写做根。带有@SpringBootApplication注解的入口类放在根位置。
综合案例
创建MyDataSource对象,管理连接
引入spring boot基本环境(jar包)
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.2.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.7</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- 追加oracle驱动包 --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
src/main/resources添加application.properties配置文件
mydb.username=ZXH mydb.password=123456 mydb.url=jdbc:oracle:thin:@localhost:1521/XE mydb.driverClassName=oracle.jdbc.OracleDriver
定义MyDataSource组件,注入properties信息
@ConfigurationProperties(prefix="mydb") public class MyDataSource { //将mydb.username值注入 private String username;//对应application.properties中的key private String password; @Value("${mydb.driverClassName}") private String driver; private String url; //省略getter和setter方法 public Connection getConnection(){ try{ Class.forName(driver); System.out.println("创建一个Connection连接"); Connection con = DriverManager.getConnection(url,username,password); return con; }catch(Exception e){ e.printStackTrace(); return null; } } }
定义cn.xdl.jdboot包,定义一个主入口类
@SpringBootApplication public class BootApplication { @Bean public MyDataSource createMyDataSource(){ return new MyDataSource(); } }
编写测试类
@RunWith(SpringRunner.class)//启动 @SpringBootTest(classes={BootApplication.class})//创建spring容器实例化 public class TestDataSource { @Resource private MyDataSource myds; @Test public void test1() throws SQLException{ System.out.println(myds); Connection con = myds.getConnection(); System.out.println(con); con.close(); } }
创建c3p0连接池对象,管理连接
在pom.xml中追加c3p0驱动包
<dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency>
在application.properties追加连接参数定义
(user、password、jdbcUrl、driverClass使用的是c3p0连接池组件的属性名)c3p0.user=ZXH c3p0.password=123456 c3p0.jdbcUrl=jdbc:oracle:thin:@localhost:1521/XE c3p0.driverClass=oracle.jdbc.OracleDriver
在BootApplication中创建c3p0连接池对象,自动注入properties连接参数
@Bean @ConfigurationProperties(prefix="c3p0") public DataSource createC3p0DataSource(){ ComboPooledDataSource dataSource = new ComboPooledDataSource(); //不需要手工设置连接参数, //会自动调用set注入application.properties中"c3p0.属性名"的值 return dataSource; }
测试c3p0连接池
@RunWith(SpringRunner.class)//启动 @SpringBootTest(classes={BootApplication.class})//创建spring容器实例化 public class TestDataSource { @Resource private DataSource c3p0ds; @Test public void test2() throws SQLException{ Connection con = c3p0ds.getConnection(); System.out.println(con); con.close(); } }