spring boot 学习

来源:互联网 发布:查询统计不重复的数据 编辑:程序博客网 时间:2024/06/06 09:04

菜鸟刚接触spring boot


今天学了spring boot 算是一个入门吧。

用ldea 新建一个spring boot项目:Flie --- New Project-----

如果spring initializr没有出现 说明你插件没装,需要在setting---plugins中安装spring的插件(应该是 spring boot插件),

接下去基本上就是next。。。。 新建完之后需要配置resources下的application(支持properties和yml),由于spring boot内置tomcat。所以只需要配置端口即可,



1、sping boot热部署

<dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-devtools</artifactId>   <optional>true</optional><!-- optional=true,依赖不会传递,该项目依赖devtools;之后依赖myboot项目的项目如果想要使用devtools,需要重新引入 --></dependency>


setting---》build,execution---》勾选build project,然后shift+ctrl+alt+/----》respro

勾选 xxxxxxx.app.running

这样就可以了。

2、spring boot 使用thymeleaf模板

<!--thymeleaf模板--><!--<dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>-->
thymeleaf:  cache: false  encoding: UTF-8  mode: HTML5  prefix: classpath:/templates/  suffix: .html


这样就可以了,注意thymeleaf标签,这个很重要

http://www.open-open.com/lib/view/open1383622135586.html

http://www.cnblogs.com/nuoyiamy/p/5591559.html

<input type="radio" name="isusecookie" value="0"  th:checked="${rule.isusecookie == 0}" />

找了好久

3.spring boot 使用jsp

<dependency>   <groupId>javax.servlet</groupId>   <artifactId>jstl</artifactId></dependency><dependency>   <groupId>javax.servlet</groupId>   <artifactId>javax.servlet-api</artifactId></dependency><dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-tomcat</artifactId></dependency><dependency>   <groupId>org.apache.tomcat.embed</groupId>   <artifactId>tomcat-embed-jasper</artifactId></dependency>

mvc:  view:    prefix: /WEB-INF/jsp/    suffix: .jsp

在main下新建webapp/WEB-INF/JSP文件夹

注意,这个webapp要和resources同级目录,不然会报404。还有,不能有@EnableWebMVC注解,有这个注解的话会报找不到视图的错。

4、spring boot使用pageHelper

  <!--pageHelper插件--><dependency>   <groupId>com.github.pagehelper</groupId>   <artifactId>pagehelper-spring-boot-starter</artifactId>   <version>1.1.1</version></dependency>
pagehelper:  reasonable: true  support-methods-arguments: true  params: count=countSql  helper-dialect: mysql

@RequestMapping("/demo/page")@ResponseBodypublic PageInfo<Rule> page(){    PageHelper.startPage(1, 10);    List<Rule> rules = ruleService.getAll();    PageInfo<Rule> pageInfo = new PageInfo<>(rules);    return pageInfo;}

但是,这个pagehelper是不能用@antowire注入的,会报错,我觉得应该需要加这个配置

相当于讲pagehelper注入spring容器中。

5、spring boot使用generator插件生成model mapper

<plugin>   <groupId>org.mybatis.generator</groupId>   <artifactId>mybatis-generator-maven-plugin</artifactId>   <version>1.3.5</version>   <dependencies>      <dependency>         <groupId>mysql</groupId>         <artifactId>mysql-connector-java</artifactId>         <version> 5.1.39</version>      </dependency>      <dependency>         <groupId>org.mybatis.generator</groupId>         <artifactId>mybatis-generator-core</artifactId>         <version>1.3.5</version>      </dependency>   </dependencies>   <executions>      <execution>         <id>Generate MyBatis Artifacts</id>         <phase>package</phase>         <goals>            <goal>generate</goal>         </goals>      </execution>   </executions>   <configuration>      <verbose>true</verbose>      <overwrite>true</overwrite>   </configuration></plugin>

 generatorConfig.xml在resources目录下。

双击maven project 的generator插件就可以生成。注意这里的配置,可以让RuleExample不生成

看http://blog.csdn.net/u011493599/article/details/53928379


6、spring boot整合mybatis


<dependency>   <groupId>org.mybatis.spring.boot</groupId>   <artifactId>mybatis-spring-boot-starter</artifactId>   <version>1.2.0</version></dependency>
<dependency>   <groupId>mysql</groupId>   <artifactId>mysql-connector-java</artifactId></dependency>
mybatis:  type-aliases-package: com.hgh.spingbootdemo.entity  mapper-locations: classpath:mapper/*.xml
这样就可以用了。

7、spring boot使用druid数据源

<dependency>   <groupId>com.alibaba</groupId>   <artifactId>druid</artifactId>   <version>1.0.18</version></dependency>

@Configurationpublic class DruidDBConfig {  //  private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class);    @Value("${spring.datasource.url}")    private String dbUrl;    @Value("${spring.datasource.username}") // 这是从application.yml中读取的
    private String username;
    @Value("${spring.datasource.password}")    private String password;    @Value("${spring.datasource.driver-class-name}")    private String driverClassName;    @Value("${spring.datasource.filters}")    private String filters;    @Value("${spring.datasource.maxActive}")    private int maxActive;    @Value("${spring.datasource.initialSize}")    private int initialSize;    @Value("${spring.datasource.minIdle}")    private int minIdle;    @Value("${spring.datasource.maxWait}")    private int maxWait;    @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")    private int timeBetweenEvictionRunsMillis;    @Value("${spring.datasource.minEvictableIdleTimeMillis}")    private int minEvictableIdleTimeMillis;    @Value("${spring.datasource.validationQuery}")    private String validationQuery;    @Value("${spring.datasource.testWhileIdle}")    private boolean testWhileIdle;    @Value("${spring.datasource.testOnBorrow}")    private boolean testOnBorrow;    @Value("${spring.datasource.testOnReturn}")    private boolean testOnReturn;    @Value("${spring.datasource.poolPreparedStatements}")    private boolean poolPreparedStatements;    @Value("${spring.datasource.maxOpenPreparedStatements}")    private int maxOpenPreparedStatements;    @Bean(value = "dataSource")    public DataSource dataSource(){        DruidDataSource dataSource = new DruidDataSource();        dataSource.setUrl(dbUrl);        dataSource.setUsername(username);        dataSource.setPassword(password);        dataSource.setDriverClassName(driverClassName);        dataSource.setInitialSize(initialSize);        dataSource.setMinIdle(minIdle);        dataSource.setMaxActive(maxActive);        dataSource.setMaxWait(maxWait);        dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);        dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);        dataSource.setValidationQuery(validationQuery);        dataSource.setTestWhileIdle(testWhileIdle);        dataSource.setTestOnBorrow(testOnBorrow);        dataSource.setTestOnReturn(testOnReturn);        dataSource.setPoolPreparedStatements(poolPreparedStatements);        dataSource.setMaxOpenPreparedStatements(maxOpenPreparedStatements);        try {            dataSource.setFilters(filters);        } catch (SQLException e) {            e.printStackTrace();        }        return dataSource;    }}

这个是给druid配置属性,然后将druid注入spring。


8、spring boot使用redis

引入依赖:

<dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-data-redis</artifactId></dependency>
配置redis属性:

# REDIS (RedisProperties)# Redis数据库索引(默认为0spring.redis.database=0# Redis服务器地址spring.redis.host=192.168.111.128# Redis服务器连接端口spring.redis.port=6379# Redis服务器连接密码(默认为空)spring.redis.password=# 连接池最大连接数(使用负值表示没有限制)spring.redis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=0

redis有2个模板

@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Autowiredprivate RedisTemplate redisTemplate;
StringRedisTemplate相当于 RedisTemplate的实现,只能用String类型存入redis。

如果想要将对象存入redis,需要实现序列化接口,用hashSet存,存的方式是用二进制数据存。

也可以参照http://blog.didispace.com/springbootredis/ 这样 不过,我没试过


9、Spring boot开启定时调度任务

@EnableScheduling 开启定时调度,然后@Scheduled(fixedRate=5000)就可以开启定时任务了,应该和spring的@Scheduled是一样的


10、Spring boot开启异步任务

APPlication上加上@EnableAsync

定义Task

@Componentpublic class Task {    public static Random random =new Random();    @Async    public Future<String> doTaskOne() throws Exception {        System.out.println("开始做任务一");        long start = System.currentTimeMillis();        Thread.sleep(random.nextInt(10000));        long end = System.currentTimeMillis();        System.out.println("完成任务一,耗时:" + (end - start) + "毫秒");        return new AsyncResult<>("任务一完成");    }    @Async    public Future<String> doTaskTwo() throws Exception {        System.out.println("开始做任务二");        long start = System.currentTimeMillis();        Thread.sleep(random.nextInt(10000));        long end = System.currentTimeMillis();        System.out.println("完成任务二,耗时:" + (end - start) + "毫秒");        return new AsyncResult<>("任务二完成");    }    @Async    public Future<String> doTaskThree() throws Exception {        System.out.println("开始做任务三");        long start = System.currentTimeMillis();        Thread.sleep(random.nextInt(10000));        long end = System.currentTimeMillis();        System.out.println("完成任务三,耗时:" + (end - start) + "毫秒");        return new AsyncResult<>("任务三完成");    }}

然后开启Task即可。

11、Spring boot使用缓存

(1)用Ecache做缓存

添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
需要在resources目录下新建一个ehcache.xml文件

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd">
<cache name="users"
maxEntriesLocalHeap="200"
timeToLiveSeconds="600">
</cache>
</ehcache>
Application上添加@EnableCaching注解


@CacheConfig(cacheNames = "users")
public interface UserRepository extends JpaRepository<User, Long> {
@Cacheable(key = "#p0", condition = "#p0.length() < 10")
User findByName(String name);
}
加上@CacheConfig,@Cacheable注解即可

这些注解可以看 http://blog.csdn.net/poorcoder_/article/details/55258253

(2)使用redis做缓存

添加依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
配置redis属性:

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop
spring.jpa.properties.hibernate.show_sql=true
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
Application上添加@EnableCaching注解

UserRepository 同上

注意:

spring boot 使用redis做缓存和用EhCache做缓存的区别:

1、EhCache做缓存需要在resources下新建ehcache.xml,pom.xml中加入ehcache包、spring-boot-start-cache包。而redis不需要ehcache.xml,pom.xml中加入spring-boot-starter-data-redis包。

2. EhCache做缓存如果更新之后,再次查询值会变,但是redis不会变。

原因:在EhCache缓存时没有问题,主要是由于EhCache是进程内的缓存框架,第一次通过select查询出的结果被加入到EhCache缓存中,第二次查询从EhCache取出的对象与第一次查询对象实际上是同一个对象(可以在使用Chapter4-4-1工程中,观察u1==u2来看看是否是同一个对象),因此我们在更新age的时候,实际已经更新了EhCache中的缓存对象。

 

而Redis的缓存独立存在于我们的Spring应用之外,我们对数据库中数据做了更新操作之后,没有通知Redis去更新相应的内容,因此我们取到了缓存中未修改的数据,导致了数据库与缓存中数据的不一致。

 

虽然EhCache已经能够适用很多应用场景,但是由于EhCache是进程内的缓存框架,在集群模式下时,各应用服务器之间的缓存都是独立的,因此在不同服务器的进程间会存在缓存不一致的情况。即使EhCache提供了集群环境下的缓存同步策略,但是同步依然需要一定的时间,短暂的缓存不一致依然存在。

 

在一些要求高一致性(任何数据变化都能及时的被查询到)的系统和应用中,就不能再使用EhCache来解决了,这个时候使用集中式缓存是个不错的选择。但是,我写的demo没有变。。。还需要研究


12、使用spring boot实现发送邮件

添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-velocity</artifactId>
</dependency> //这个是用与发送邮件的添加图片
application.yml中配置

spring.mail.host=smtp.qq.com
spring.mail.username=username@qq.com
spring.mail.password=password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
需要开启邮箱的POP3/STMP协议。

//发送邮件

@Autowired
private JavaMailSender mailSender;
@Autowired
private VelocityEngine velocityEngine;
@Test
public void sendSimpleMail() throws Exception {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("dyc87112@qq.com");
message.setTo("dyc87112@qq.com");
message.setSubject("主题:简单邮件");
message.setText("测试邮件内容");
mailSender.send(message);
}
@Test
public void sendAttachmentsMail() throws Exception {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom("dyc87112@qq.com");
helper.setTo("dyc87112@qq.com");
helper.setSubject("主题:有附件");
helper.setText("有附件的邮件");
FileSystemResource file = new FileSystemResource(new File("weixin.jpg"));
helper.addAttachment("附件-1.jpg", file);
helper.addAttachment("附件-2.jpg", file);
mailSender.send(mimeMessage);
}
@Test
public void sendInlineMail() throws Exception {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom("dyc87112@qq.com");
helper.setTo("dyc87112@qq.com");
helper.setSubject("主题:嵌入静态资源");
helper.setText("<html><body><img src=\"cid:weixin\" ></body></html>", true);
FileSystemResource file = new FileSystemResource(new File("weixin.jpg"));
helper.addInline("weixin", file);
mailSender.send(mimeMessage);
}
//这个好像会失败
@Test
public void sendTemplateMail() throws Exception {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom("dyc87112@qq.com");
helper.setTo("dyc87112@qq.com");
helper.setSubject("主题:模板邮件");
Map<String, Object> model = new HashedMap();
model.put("username", "didi");
String text = VelocityEngineUtils.mergeTemplateIntoString(
velocityEngine, "template.vm", "UTF-8", model);
helper.setText(text, true);
mailSender.send(mimeMessage);
}

13、Spring boot使用RabbitMQ

RabbitMQ安装可以看上一篇

添加依赖

<dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-amqp</artifactId></dependency>
配置RabbitMQ属性

spring.application.name=spirng-boot-rabbitmq-senderspring.rabbitmq.host=192.168.111.128spring.rabbitmq.port=5672spring.rabbitmq.username=adminspring.rabbitmq.password=123456
注入Queue

@Configurationpublic class SenderConf {    @Bean   public Queue queue(){        return new Queue("queue");    }}
发送

@Componentpublic class Sender {    @Autowired    private AmqpTemplate template;    public void send(){        template.convertAndSend("queue","hello,rabbit");    }}

接受方其他不需要变,

@Component
@RabbitListener(queues = "hello")
public class Receiver {
@RabbitHandler
public void process(String hello) {
System.out.println("Receiver : " + hello);
}
}
这个只是RabbitMQ的初步使用。具体得看需求。


Spring Boot 差不多就是这么多了。。