SpringBoot初体验
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的三种启动
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