1.elipse中创建Springboot项目并启动

具体创建步骤请参考:Eclipse中创建新的Spring Boot项目

2.项目的属性配置

a.首先我们在项目的resources目录下application.yml中添加以下内容:

server:
port: 8080
#set a prefix on our URLRequestMapping
#context-path: /boot str1: hello
str2: world
content: "str1: ${str1}, str2:${str2}"
gril:
name: Hanmeimei
age: 21
boy:
name: Lilei
age: 22

谈谈数据绑定

b.@Value,我们在我们创建的Controller中加入

@ComponentScan(basePackages="com.huhu")
@RestController
public class HelloController { @Value("${str1}")
private String str1;
@Value("${str2}")
private String str2;
@Value("${content}")
private String content; @RequestMapping(value ="/hello",method=RequestMethod.GET)
public String say() { return str1+" "+str2+" "+content;
}
}

启动结果:

c.@Component和@ConfigurationProperties的结合使用创建bean

boy.java

//把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
@Component
@ConfigurationProperties(prefix="boy")
public class Boy { private String name;
private Integer age; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
} }

gril.java

//把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
@Component
//实现该类的属性与application.yml中的以gril为前缀的数据匹配
@ConfigurationProperties(prefix="gril")
public class Gril { private String name;
private Integer age; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
} }

HelloController.java

@ComponentScan(basePackages="com.huhu")
@RestController
public class HelloController { @Autowired
private Gril gril; @Autowired
private Boy boy; @RequestMapping(value ="/hello",method=RequestMethod.GET)
public String say() { return gril.getName()+" "+boy.getName();
}
}

启动结果:

这里有一个问题,为什么它们都能把我们application.yml我们设置属性怎么就显示到网页上了?

原因:当你没有声明ViewResolver时,spring会给你注册一个默认的ViewResolver,其是JstlView的实例。

d.改变ViewResolver

首先我们在pom.xml中添加依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

然后在resources/templates/中添加huhu.xml

<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>hello SpringBoot!</h1>
</body>
</html>

改变HelloController.java

@ComponentScan(basePackages="com.huhu")
@Controller
public class HelloController { @RequestMapping(value ="/hello",method=RequestMethod.GET)
public String say() { return "huhu";
}
}

启动结果:

细心的你是否发现了我上面用的是@Controller,上面都用的是@RestController,我们来看一下区别吧,官方文档里这样说:@RestController is a stereotype annotation that combines @ResponseBody and @Controller.很显然它包括了@ResponseBody and @Controller,上面我们改变了ViewResolver,当然要用@Controller了,json,xml也是类似的做法。

你也可以把上面的HelloController.java改成:

@ComponentScan(basePackages="com.huhu")
@RestController
public class HelloController {
@RequestMapping(value ="/hello",method=RequestMethod.GET)
public String say() {
return "huhu";
}
}

启动结果:

3.SpringBoot杂谈

a.SpringBoot的三种启动

1.elipse或者idea一键启动
2.mvn spring-boot:run
3.mvn install    cd /target   java -jar ***.jar
既然可以有多种启动方法,我们可不可以启动两个,满足我们线上和线下的开发需求呢?答案是可以:
b.分环境启动SpringBoot
先设置我们resources中application.yml,我们复制两个,分别起名为
application-dev.yml
server:
port: 8081
#set a prefix on our URLRequestMapping
#context-path: /boot str1: hello
str2: world
content: "str1: ${str1}, str2:${str2}"
gril:
name: Hanmeimei
age: 21
boy:
name: Lilei
age: 22

application-pro.yml

server:
port: 8080
#set a prefix on our URLRequestMapping
#context-path: /boot str1: hello
str2: world
content: "str1: ${str1}, str2:${str2}"
gril:
name: Hanmeimei
age: 21
boy:
name: Lilei
age: 22

修改application.yml

spring:
profiles:
active: dev

我们分别启动,一个用elipse,一个用第三种方法cmd

启动结果:

有人会说,这无非就是开启了两个不同端口的tomcat么?这能做什么啊?

对的,我想到了可以用它配合nginx做负载均衡啊,大家可以看看这个:Nginx+Tomcat 实现负载均衡(Windows单机测试),是不是SpringBoot让一些东西变简单了。

4.Spring操作mysql数据库

a.pom.xml引入两个依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

b.在application.yml中写入配置

  datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false
username: root
password: taizi1203 jpa:
hibernate:
ddl-auto: create
show-sql: true

c.创建你要在数据库中写的表的Bean

Dril.java

//数据持久化
@Entity
public class Dril { @Id
@GeneratedValue
private Integer id; private String name; private Integer age; public Dril() { } public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} }

d.启动结果:

当看到这个,代表你成功了,数据库中已经生成这个表。看到其他,请核对前面的配置

箭头所指的体现了我们在application.yml中的,如果是create,每次都会删掉原来的表,update只会更新,其他自己看。

e.编写Controller和DrilService

DrilController.java

@RestController
public class DrilController { @Autowired
private DrilService drilService; @RequestMapping(value="/dril",method=RequestMethod.GET)
public List<Dril> getDrils(){ List<Dril> drils =drilService.findAll();
return drils;
} }

DrilService.java

//第一个参数是我们要返回的对象,第二个是ID extends Serializable,即我们在生成数据库的时候指定的Id的类型
public interface DrilService extends JpaRepository<Dril,Integer>{ }

f.启动结果

有FE助手的出现json

IE结果图:

纳闷了,页面返回的数据怎么json了,看了一下IE中的结果,还好没有说错(spring默认注册ViewResolver是JstlView)。其他操作,我就不具体做了。

JPA好像为我们做了好多事,但是他的方法才有几个,总有点他不能干的的,如我们不通过ID来的操作数据库,这时候我们扩展一下他:

DrilJPA.java

public interface DrilJPA extends JpaRepository<Dril,Integer>{

    //通过name来查询数据库,findByXxxx不能乱写
public List<Dril> findByName(String name);
}

添加Controller:

@RequestMapping(value="/drils/{name}",method=RequestMethod.GET)
public List<Dril> getDrilName(@PathVariable("name")String name){ List<Dril> drils =drilService.findByName(name);
return drils;
}

启动结果:

5.事务管理

事务:一系列操作,要么全部成功,要么全部不成功。Spring事务管理,大家参考:Spring事务管理

DrilService.java

@Service
public class DrilService { @Autowired
private DrilJPA drilJPA; public void addTwo(){
Dril dril1=new Dril();
dril1.setId(3);
dril1.setAge(20);
dril1.setName("xiaosan");
drilJPA.save(dril1); Dril dril2=new Dril();
dril1.setId(4);
dril1.setAge(24);
dril1.setName("xiaosi");
drilJPA.save(dril2);
} }

添加Controller

    @Autowired
private DrilService drilService2; @RequestMapping(value="/drils/addTwo",method=RequestMethod.GET)
public void getDrilName(){ drilService2.addTwo();;
}

如果运行结果成这样,这是事务管理不想看到的,xiaosi跑路了?

SpringBoot有个解决办法:

给Service层方法上添加@Transactional就可以解决。

    @Transactional
public void addTwo(){
Dril dril1=new Dril();
dril1.setId(3);
dril1.setAge(20);
dril1.setName("xiaosan");
drilJPA.save(dril1); Dril dril2=new Dril();
dril1.setId(4);
dril1.setAge(24);
dril1.setName("xiaosi");
drilJPA.save(dril2);
}

好了,就分享到这里吧,后面还会更新。

谢谢大家的阅读,博客不易,请转载注明地址:http://www.cnblogs.com/huhu1203/p/7638054.html

SpringBoot初体验的更多相关文章

  1. SpringBoot初体验及原理解析

    一.前言 ​ 上篇文章,我们聊到了SpringBoot得以实现的幕后推手,这次我们来用SpringBoot开始HelloWorld之旅.SpringBoot是Spring框架对“约定大于配置(Conv ...

  2. SpringBoot初体验之整合SpringMVC

    作为开发人员,大家都知道,SpringBoot是基于Spring4.0设计的,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程.另外Spr ...

  3. SpringBoot初体验(续)

    1.如果你还不知道SpringBoot的厉害之处,或者你不知道SpringBoot的初级用法,请移步我的上一篇文章,传送门 2.SpringBoot中的表单验证 所谓验证,无非就是检验,对比,正如ja ...

  4. SpringBoot 初体验

    1.Spring Boot 简介 简化Spring应用开发的一个框架 整个Spring技术栈的一个大整合 J2EE开发的一站式解决方案 2.微服务 2014, martin fowler 微服务:架构 ...

  5. springboot初体验-不知道怎么创建spring-boot项目?

    https://spring.io/projects/spring-boot/ 在以上地址找到 Quick start Bootstrap your application with Spring I ...

  6. (一)SpringBoot基础篇- 介绍及HelloWorld初体验

    1.SpringBoot介绍: 根据官方SpringBoot文档描述,BUILD ANYTHING WITH SPRING BOOT (用SPRING BOOT构建任何东西,很牛X呀!),下面是官方文 ...

  7. (一)SpringBoot2.0基础篇- 介绍及HelloWorld初体验

    1.SpringBoot介绍: 根据官方SpringBoot文档描述,BUILD ANYTHING WITH SPRING BOOT (用SPRING BOOT构建任何东西,很牛X呀!),下面是官方文 ...

  8. springboot+支付宝完成秒杀项目的初体验

    springboot+支付宝完成秒杀项目的初体验 思考的问题: 首先是秒杀的商品查询,考虑到是热点数据,所以写一个接口读取当日批次的秒杀商品到redis中(那么接下来对商品的操作都放入redis中). ...

  9. 蚂蚁 RPC 框架 SOFA-RPC 初体验

    前言 最近蚂蚁金服开源了分布式框架 SOFA,楼主写了一个 demo,体验了一下 SOFA 的功能,SOFA 完全兼容 SpringBoot(当然 Dubbo 也是可以兼容的). 项目地址:Alipa ...

随机推荐

  1. Hashtable、synchronizedMap、ConcurrentHashMap 比较

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp18 Hashtable.synchronizedMap.Concurren ...

  2. Android学习记录:Paint,Canvas和Bitmap

    在Java中,利用过双缓冲技术,先将画笔画在内存上,再转化为图片,调出来. 当画的东西过多造成处理不过来时,双缓冲技术将防止闪屏. 在Paint方法下,我们这样写: BufferedImage tmp ...

  3. oracle 数据的导入导出

    一.数据导出 1.为输出路径建立一个数据库的directory对象. create or replace directory dumpdir as 'd:\'; 可以通过:select * from ...

  4. unity中object 对象之间用c# delegate方式进行通信

    unity 3D经常需要设计到不同object之间数据通信和事件信息触发.这里可以利用C#本身的事件和代理的方法来实现. 这里实现了在GUI上点击按钮,触发事件,移动object cube移动的例子. ...

  5. 201521123020《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 运用到了equ ...

  6. java程序设计 彩票购买抽奖程序 团队博客

    一.项目介绍 题目要求 功能要求: 模拟福利彩票36选7,实现彩票的抽奖与中奖通知功能. 1.允许注册用户,用户信息包括用户id,用户名,密码,账户金额,电话号码等属性. 2.允许注册用户购买彩票:手 ...

  7. 201521123023《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  8. 201521123049 《JAVA程序设计》 第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  9. iOS内购 服务端票据验证及漏单引发的思考.

    因业务需要实现了APP内购处理,但在过程中出现了部分不可控的因素,导致部分用户反映有充值不成并漏单的情况. 仔细考虑了几个付费安全上的问题,凡是涉及到付费的问题都很敏感,任何一方出现损失都是不能接受的 ...

  10. 14.LINUX-platform机制实现驱动层分离(详解)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 本节目标:        学习platform机制,如何实现驱动层分离 1.先来看看我们之前分析输入子系统的分层概念,如下图所示: 如上图所示,分 ...