Spring Boot实战(二)

1. 开发你的第一个Spring Boot应用

1.1. 编写代码

classpath的依赖见Spring Boot实战1.4.2. 修改pom.xml,为了完成这个应用程序,我们需要创建一个单独的java文件,在src/main/java下添加一个名为src/main/java/Example.java的文件:

import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
    @RequestMapping("/")
    String home() {
        return "Hello Spring Boot!";
    }
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Example.class, args);
    }
}

1.1.1. @RestController和@RequestMapping注解

Example类使用的第一个注解是@RestController,它是一种构造型注解,在本示例中,我们的类是一个web controller,所以当处理进来的请求时,Spring会询问它。

@RequestMapping注解提供路由信息。它告诉Spring任何来自”/”路径的HTTP请求应该被映射到home方法上,@RestController注解告诉Spring以字符串的形式渲染结果,并直接返回给调用者。

注:@RestController和@RequestMapping注解是Spring MVC部分,并不是Spring Boot的。

1.1.2. @EnableAutoConfiguration注解

@EnableAutoConfiguration注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring,由于Spring-boot-starter-web添加了tomcat和Spring MVC,所以auto-Configuration将假定你正在开发一个web应用并相应地对Spring进行配置。

1.1.3. main方法

我们的应用程序最后部分是main方法,这只是一个标准的方法,它遵循java对于一个应用程序的入口点的约定,我们的main方法通过调用run,将业务委托给Spring Boot的SpringApplication类。SpringApplication将引导我们的应用,启动Spring,相应的启动被自动配置的tomcat web服务器。我们需要将Example.class作为参数传递给run方法来告诉SpringApplication谁是主要的Spring组件,为了暴露任何的命令行参数,args数组也会被传递过去。

1.1.4. 运行示例

到此我们的应用应该可以工作了。由于使用了spring-boot-starter-parent POM,这样我们就有了一个非常有用的run目标,我们可以用它启动程序。在项目根目录下输入 mvn spring-boot:run来启动应用:


如果使用一个浏览器打开localhost:8080,你应该可以看到以下输出:

Hello Spring Boot!

2. 使用SQL数据库

Spring框架为使用SQL数据库提供了广泛的支持。从使用JdbcTemplate直接访问JDBC到完全的对象关系映射技术,比如Hibernate。Spring Data提供一个额外的功能,直接从接口创建Repository实现,并使用约定从你的方法名生成查询。

2.1. 配置DataSource

Java的javax.sql.DataSource接口提供了一个标准的使用数据库连接的方法。传统做法是,一个DataSource使用一个URL连同相应的证书去初始化一个数据库连接。

2.1.1. 对内嵌数据库的支持

开发应用时使用内存数据库是很实用的。显而易见地,内存数据库不需要提供持久化存储。你不需要在应用启动时填充数据库,也不需要在应用结束时丢弃数据。

Spring Boot可以自动配置的内嵌数据库包括H2、HSQL和Derby。你不需要提供任何连接URLs,只需要简单的添加你想使用的内嵌数据库依赖。

示例:典型的POM依赖如下:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
	<groupId>org.hsqldb</groupId>
	<artifactId>hsqldb</artifactId>
	<scope>runtime</scope>
</dependency>

注:对于自动配置的内嵌数据库,你需要依赖spring-jdbc。在示例中,它通过spring-boot-starter-data-jpa被传递性的拉过来了。

2.1.2. 连接到一个生产环境数据库

在生产环境中,数据库连接可以使用DataSource池进行自动配置。下面是选取一个特定实现的算法:

1)由于Tomcat数据源连接池的性能和并发,在tomcat可用时,我们总是优先使用它。

2)如果HikariCP可用,我们将使用它。

3)如果Commons DBCP可用,我们将使用它,但在生产环境不推荐使用它。

4)最后,如果Commons DBCP2可用,我们将使用它。

如果你使用spring-boot-starter-jdbc或spring-boot-starter-data-jpa starter POMs,你将会自动获取对tomcat-jdbc的依赖。

注:其他的连接池可以手动配置。如果你定义自己的DataSource bean,自动配置不会发生,DataSource配置通过外部配置文件的spring.datasource.*属性控制

你可能会在application.properties中声明下面的片段:

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

其他可选的配置可以查看DataSourceProperties.java。同时注意你可以通过spring.datasource.*配置任何DataSource实现相关的特定属性:具体参考你使用的连接池实现的文档。

注:既然Spring  Boot能够从大多数数据库的url上推断出driver-class-name,那么你就不需要再指定它了。对于一个将要创建的DataSource连接池,我们需要能够验证Driver是否可用,所以我们会在做任何事情之前检查它。比如,如果你设置

spring.datasource.driverClassName=com.mysql.jdbc.Driver,然后这个类就会被加载。

2.1.3. 连接到一个JNDI数据库

如果正在将Spring Boot应用部署到一个应用服务器,你可能想要用应用服务器内建的特性来配置和管理你的DataSource,并使用JNDI访问它。

spring.datasource.jndi-name属性可以用来替代spring.datasource.url,spring.datasource.username和spring.datasource.password去从一个特定的JNDI路径访问DataSource。

比如,下面application.properties中的片段展示了如何获取JBoss定义的DataSource:

2.2. 使用JdbcTemplate

Spring的JdbcTemplate和NamedParameterJdbcTemplate类是被自动配置的,你可以在自己的beans中通过@Autowire直接注入它们。

import	org.springframework.beans.factory.annotation.Autowired;
import	org.springframework.jdbc.core.JdbcTemplate;
import	org.springframework.stereotype.Component;
@Component
public  class	MyBean	{
		private  final	 JdbcTemplate  jdbcTemplate;
		@Autowired
		public  MyBean(JdbcTemplate	jdbcTemplate)	{
				this.jdbcTemplate	=	jdbcTemplate;
		}
		//	...
}

2.2. JPA和Spring Data

Java持久化API是一个允许你将对象映射为关系数据库的标准技术。spring-boot-starter-data-jpa POM提供了一种快速上手的方式。它提供下列关键的依赖:

1)Hibernate - 一个非常流行的JPA实现。

2)Spring Data JPA - 让实现基于JPA的repositories更容易。

3)Spring ORMs - Spring框架的核心ORM支持。

2.2.1. 实体类

传统上,JPA实体类被定义到一个persistence.xml文件中。在Spring Boot中,这个文件不是必需的,并被'实体扫描'替代。默认情况下,在你主(main)配置类(被@EnableAutoConfiguration或@SpringBootApplication注解的类)下的所有包都将被查找。

任何被@Entity,@Embeddable或@MappedSuperclass注解的类都将被考虑。一个普通的实体类看起来像下面这样:

import	java.io.Serializable;
import	javax.persistence.*;
@Entity
public  class	City	implements Serializable	{
			@Id
			@GeneratedValue
			private	Long	id;
			@Column(nullable	=	false)
			private	String	name;
			@Column(nullable	=	false)
			private	String	state;
            //....
	
}

2.2.2. Spring Data JPA仓库

Spring Data JPA仓库(repositories)是用来定义访问数据的接口。根据你的方法名,JPA查询会被自动创建。比如,一个CityRepository接口可能声明一个findAllByState(String state)方法,用来查找给定状态的所有城市。

对于比较复杂的查询,你可以使用Spring Data的Query来注解你的方法。

Spring Data仓库通常继承自Repository或CrudRepository接口。如果你使用自动配置,包括在你的主配置类(被@EnableAutoConfiguration或@SpringBootApplication注解的类)的包下的仓库将会被搜索。

下面是一个传统的Spring Data仓库:

mport	org.springframework.data.domain.*;
import	org.springframework.data.repository.*;
public	interface	CityRepository	extends	Repository<City,	Long>	{
				Page<City>	findAll(Pageable	pageable);
				City	findByNameAndCountryAllIgnoringCase(String	name,	String	country);
}

2.2.3. 创建和删除JPA数据库

默认情况下,只有在你使用内嵌数据库(H2, HSQL或Derby)时,JPA数据库才会被自动创建。你可以使用spring.jpa.*属性显示的设置JPA。比如,为了创建和删除表,你可以将下面的配置添加到application.properties中:

spring.jpa.hibernate.ddl-auto=create-drop

注:Hibernate自己内部对创建,删除表支持(如果你恰好记得这回事更好)的属性是hibernate.hbm2ddl.auto。使用spring.jpa.properties.*(前缀在被添加到实体管理器之前会被剥离掉),你可以设置Hibernate本身的属性,比如hibernate.hbm2ddl.auto。

示例:spring.jpa.properties.hibernate.globally_quoted_identifiers=true将传递hibernate.globally_quoted_identifiers到Hibernate实体管理器。

默认情况下,DDL执行(或验证)被延迟到ApplicationContext启动。这也有一个spring.jpa.generate-ddl标识,如果Hibernate自动配置被激活,那该标识就不会被使用,因为ddl-auto设置粒度更细。


3. ActiveMQ支持

3.1. activeMQ配置

如果发现ActiveMQ在classpath下可用,Spring Boot会配置一个ConnectionFactory。如果需要代理,将会开启一个内嵌的,已经自动配置好的代理(只要配置中没有指定代理URL)。ActiveMQ配置是通过spring.activemq.*中的外部配置来控制的。例如,你可能在application.properties中声明下面的片段:

spring.activemq.broker-url=tcp://192.168.1.210:9876
spring.activemq.user=admin
spring.activemq.password=secret

注:具体可参考ActiveMQProperties.java

3.2. 使用JNDI ConnectionFactory

如果你在一个应用服务器中运行你的应用,Spring Boot将尝试使用JNDI定位一个JMS ConnectionFactory。默认情况会检查java:/JmsXA和java:/XAConnectionFactory。如果需要的话,你可以使spring.jms.jndi-name属性来指定一个替代位置。

spring.jms.jndi-name=java:/MyConnectionFactory

3.3. 发送消息

Spring的JmsTemplate会被自动配置,你可以将它直接注入到你自己的beans中:

import	org.springframework.beans.factory.annotation.Autowired;
import	org.springframework.jms.core.JmsTemplate;
import	org.springframework.stereotype.Component;
@Component
public	class	 MyBean	{
private	final  JmsTemplate	jmsTemplate;
@Autowired
public	MyBean(JmsTemplate	jmsTemplate)	{
this.jmsTemplate	=	jmsTemplate;
}
//	...
}

3.4. 接收消息

当JMS基础设施能够使用时,任何bean都能够被@JmsListener注解,以创建一个监听者端点。如果没有定义JmsListenerContainerFactory,一个默认的将会被自动配置。下面的组件在someQueue目标上创建一个监听者端点。

@Component

public class  MyBean {

    @JmsListener(destination = "someQueue")

    public   void processMessage(String content) {

              // ...

    }

}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值