SpringBoot 入门

SpringBoot的特点

解决了复杂的配置,统一依赖管理: //  自动配置、起步依赖、命令行界面、Actuator- 为开发者提供一个非常快速的、广泛接受的入门体验- 开箱即用(启动器starter-其实就是SpringBoot提供的一个jar包),但通过自己设置参数(.properties),即可快速摆脱这种方式。- 提供了一些大型项目中常见的非功能性特性;如内嵌服务器、安全、指标,健康检测、外部化配置等- 绝对没有代码生成,也无需 XML 配置。
Spring核心:IoC:将原本创建UserService对象的控制权交给Spring管理。三层之间充分解耦。spring IoC容器提供两种基本的容器类型:BeanFactory:基础类型IoC容器,BeanFactory容器启动较快,所需资源有限 对于系统资源有限,并且功能要求不严格的场景,使用BeanFactory容器ApplicationContext:   比较高级的容器,启动较慢,占用资源较多 对于系统资源充足,并需要提供较多功能的使用场景,使用ApplicationContext容器DI:在Spring框架负责创建Bean对象时,动态的将对象注入到Bean组件中。AOP:对OOP的一种延伸,主要是为了在不修改源代码的情况下,通过代理对象,可以实现功能的增强。 两种实现方式:1. JDK原生动态代理(对实现了某个接口的类进行增强)。2. CgLib动态代理

一. 测试

添加依赖

1:添加父工程坐标//   继承SpringBoot父依赖,导入springCloud, 通用Mapper启动器, mysql驱动, 添加web启动器, tk.mybatis 减少数据库的配置<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version></parent><!-- springCloud -->...<!-- 通用Mapper启动器 -->...<!-- mysql驱动 -->...2:添加web启动器:<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><!-- mysql驱动 -->...<!-- tk.mybatis 减少数据库的配置-->...
3:管理jdk版本:(可选)<properties><java.version>1.8</java.version></properties>

添加代码

启动类(名字随便起) :@SpringBootApplication// @MapperScan("com.quokka.user.mapper") 映射器扫描 添加了 tk.mybatis 依赖才需要@MapperScan("com.quokka.user.mapper") //  <- 映射器扫描 添加了 tk.mybatis 依赖才需要public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}编写controller: @RestControllerpublic class HelloController {@GetMapping("/hello")public String hello(){return "hello, spring boot!";}}

注意文件层级

启动查看日志

此时即可测试访问 http://localhost:8080/hello 就能看到此页面

二. 入门

添加依赖

//   准备工作 引入Druid连接池依赖:
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.6</version>
</dependency>

添加配置文件

*使用方法二,方法三 文件名必须使用 application.properties 或 application.yml *
application.properties 或 application.yml 如有重叠属性,默认以 properties 优先

配置方式一: application.properties 文件名: jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://127.0.0.1:3306/quokkajdbc.username=rootjdbc.password=123

如何获取配置文件的参数:问
jdbc.user.name=quokka
jdbc.user.age=18

配置方式二: application.yml 文件名: spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/quokkausername: rootpassword: 123# 映射端口server:port: 80

添加代码 ( 使用配置文件的三种方式 )

方法一:
代码文件 JdbcConfig.java:@Configuration //  声明一个类作为配置类,代替xml文件@PropertySource("classpath:jdbc.properties")    //  指定外部属性文件public class JdbcConfig {@Value("${jdbc.url}")   //  属性注入String url;@Value("${jdbc.driverClassName}")String driverClassName;@Value("${jdbc.username}")String username;@Value("${jdbc.password}")String password;@Bean  //  声明在方法上,将方法的返回值加入Bean容器,代替<bean>标签public DataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(driverClassName);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}}
方法二:
代码文件 JdbcProperties.java:@ConfigurationProperties(prefix = "jdbc")   //  注解声明当前类为属性读取类   ( prefix="jdbc" 读取属性文件中,前缀为jdbc的值)public class JdbcProperties {private String url;private String driverClassName;private String username;private String password;

如何获取配置文件的参数:解

         private User user =new User();class User{private String name;private int age;// ... 略 getters 和 setters}// ... 略 getters 和 setters}代码文件 JdbcConfig.java:
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)   //  来声明要使用JdbcProperties这个类的对象
public class JdbcConfig {@Autowired    //  注入方式一: @Autowired注入private JdbcProperties prop;//  注入方式二: 构造函数注入private JdbcProperties prop;public JdbcConfig(Jdbcproperties prop){this.prop = prop;}@Beanpublic DataSource dataSource(JdbcProperties jdbc /* 注入方法三: 在声明有@Bean的方法参数注入*/) {DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(jdbc.getUrl());dataSource.setDriverClassName(jdbc.getDriverClassName());dataSource.setUsername(jdbc.getUsername());dataSource.setPassword(jdbc.getPassword());return dataSource;}
}
方法三(最简单的方法):
代码文件 JdbcConfig.java:
@Configuration
public class JdbcConfig {@Bean // 声明要注入的属性前缀,SpringBoot会自动把相关属性通过set方法注入到DataSource中@ConfigurationProperties(prefix = "jdbc")public DataSource dataSource() {return new DruidDataSource();}
}

HelloController中测试:

@RestController
public class HelloController {@Autowiredprivate DataSource dataSource;@GetMapping("hello")public String hello() {System.out.println("dataSource: " + dataSource);return "hello, spring boot!";}
}

然后打断点,Debug运行并查看:

属性注入成功

添加拦截器

拦截器不是一个普通属性,而是一个类,所以就要用到java配置方式了

如果想保持 Spring Boot 的一些默认MVC特征,同时又想自定义一些MVC配置(包括:拦截器,格式化器, 视图控制器、消息转换器 等等)
首先应该让一个类实现 WebMvcConfigurer ,并且添加 @Configuration 注解,但是千万不要加 @EnableWebMvc 注解。
如果你想要自定义HandlerMapping、HandlerAdapter、ExceptionResolver等组件,你可以创建一个WebMvcRegistrationsAdapter 实例 来提供以上组件。
如果你想要完全自定义SpringMVC,不保留SpringBoot提供的一切特征,可以自己定义类并且添加 @Configuration 注解和 @EnableWebMvc 注解

总结:通过实现 WebMvcConfigurer 并添加 @Configuration 注解来实现自定义部分SpringMvc配置。

首先我们定义一个拦截器:
public class LoginInterceptor implements HandlerInterceptor {private Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {logger.debug("preHandle method is now running!");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {logger.debug("postHandle method is now running!");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {logger.debug("afterCompletion method is now running!");}}
然后,我们定义配置类,注册拦截器:
@Configuration
public class MvcConfig implements WebMvcConfigurer{/*** 通过@Bean注解,将我们定义的拦截器注册到Spring容器* @return*/@Beanpublic LoginInterceptor loginInterceptor(){return new LoginInterceptor();}/*** 重写接口中的addInterceptors方法,添加自定义拦截器* @param registry*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 通过registry来注册拦截器,通过addPathPatterns来添加拦截路径registry.addInterceptor(this.loginInterceptor()).addPathPatterns("/**");}
}
运行并查看日志:若日志中什么都没有,是因为记录的log级别是debug,默认是显示info以上,需要进行配置。

SpringBoot通过logging.level.*=debug来配置日志级别,*填写包名

 # 设置cn.quokka包的日志级别为debuglogging:level:cn.quokka: debug

整合 jdbc 和 事务
添加依赖
<!--添加 jdbc连接和事务 启动器 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--使用MySQL 数据库 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version>
</dependency>
<!-- 通用mapper -->
<dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.1.4</version>
</dependency>
配置
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/quokkausername: rootpassword: 123
# mybatis 别名扫描
mybatis:type-aliases-package: cn.quokka.pojo# mapper.xml文件位置,如果没有映射文件,请注释掉# mapper-locations=classpath:mappers/*.xmlconfiguration:#开启驼峰命名转换map-underscore-to-camel-case: true# 如果需要查看运行Sql,可以加入日志配置:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
代码

SpringBoot中 事务 通过注解来控制 @Transactional

@Service
public class UserService {public User queryById(Long id){// 开始查询return new User();}@Transactionalpublic void deleteById(Long id){// 开始删除System.out.println("删除了: " + id);}
}

需要注意,这里没有配置mapper接口扫描包,因此需要给每一个Mapper接口添加@Mapper注解,才能被识别。

@Mapper
public interface UserMapper {
}

或者,在启动类上添加扫描包注解(推荐):

@SpringBootApplication
@MapperScan("cn.quokka.mapper")
public class Application {public static void main(String[] args) {// 启动代码SpringApplication.run(Application.class, args);}
}

以下代码示例中,我们将采用@MapperScan扫描方式进行。

public interface UserMapper extends Mapper<User>{
}

在实体类上加JPA注解:

@Data
@Table(name = "tb_user")
public class User{@Id@KeySql(useGeneratedKeys = true) // 开启自增主键回显功能private Long id;private String userName;private String password;private String name;private Integer age;private Integer sex;private Date birthday;private Date created;private Date updated;private String note;
}

=========================================
编写pojo时,经常需要编写构造函数和gettersetter方法,属性多的时候,就非常浪费时间,使用lombok插件可以解决
一. pom maven 依赖 -> lombok

org.projectlombok
lombok

二. plugins 插件 -> Lombok Plugin

然后可以在Bean上使用:
@Data :自动提供getter和setter、hashCode、equals、toString等方法以及构造函数
@Getter:自动提供getter方法
@Setter:自动提供setter方法
@Slf4j:自动在bean中提供log变量,其实用的是slf4j的日志功能。

=========================================

对UserService的代码进行简单改造:

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User queryById(Long id){// 查询return userMapper.selectByPrimaryKey(id);}@Transactionalpublic Integer saveUser(User user){// 新增return userMapper.insertSelective(user);}
}

将controller进行简单改造:

@RestController
public class HelloController {@Autowiredprivate UserService userService;@GetMapping("/user/{id}")public User hello(@PathVariable("id") Long id) {User user = this.userService.queryById(id);return user;}
}

启动测试前 注释 JdbcConfig.java文件:

注: 常用注解:
@RestController
@GetMapping("/路径")
@Configuration: 声明一个类作为配置类,代替xml文件
@PropertySource:指定外部属性文件路径
@Value: 属性注入
@Bean: 声明在方法上,将方法的返回值加入"Bean容器",代替标签
@Autowired: 注入
@ConfigurationProperties(prefix =“jdbc” ):
注解声明当前类为属性读取类:prefix="jdbc"读取属性文件中,前缀为jdbc的值
@EnableConfigurationProperties(使用的@ConfigurationProperties()的文件名.class):
声明要使用JdbcProperties(使用的@ConfigurationProperties()的文件名)这个类的对象

@SpringBootApplication      //  当前类是一个配置类- @SpringBootConfiguration    //  声明当前类是SpringBoot应用的配置类↘Spring会自动扫描到添加了@Configuration的类,并且读取其中的配置信息- @EnableAutoConfiguration↘SpringBoot自动配置- @ComponentScan↘包扫描,@SpringBootApplication注解声明的启动类 扫描声明注解的类所在包及子包

SpringBoot 入门相关推荐

  1. SpringBoot入门(二)——起步依赖

    本文来自网易云社区 在前一篇我们通过简单几步操作就生成了一个可以直接运行的Web程序,这是因为SpringBoot代替我们做了许多工作,概括来讲可以分为起步依赖和自动配置.这一篇先来看看起步依赖. 项 ...

  2. springboot 入门教程(4)--web开发(spring mvc和Thymeleaf模板,带源码)

    2019独角兽企业重金招聘Python工程师标准>>> 首先回顾下前几篇的内容:springboot 入门教程(1),springboot 入门教程-Thymeleaf(2), sp ...

  3. 【Java】SpringBoot入门学习及基本使用

    SpringBoot入门及基本使用 SpringBoot的介绍我就不多说了,核心的就是"约定大于配置",接下来直接上干货吧! 本文的实例: github-LPCloud,欢迎sta ...

  4. SpringBoot入门和配置

    一.SpringBoot入门和微服务简介  1.SpringBoot入门 springboot:J2EE一站式解决方案 springcloud:分布式整体解决方案 2.微服务简介    微服务:架构风 ...

  5. 最简单最详细的SpringBoot入门项目——HelloWorld

    最详细的SpringBoot入门项目--HelloWorld 关于SpringBoot的介绍以及优点这里就不说了,想了解的可以直接点击这里 Spring Boot百度百科 接下来我们直奔主题,开始用S ...

  6. SpringBoot简介、SpringBoot 入门程序搭建、与JDBC、Druid、Mybatis和SpringData JPA的整合

    一.SpringBoot 简介: spring boot并不是一个全新的框架,它不是spring解决方案的一个替代品,而是spring的一个封装.所以,你以前可以用spring做的事情,现在用spri ...

  7. springboot 历史版本文档_乘风破浪,SpringBoot入门

    SpringBoot入门篇 前言 在普通的java项目中,大量的xml文件配置起来相当繁琐,导致了开发效率非常低下,整合第三方框架的配置可能会存在冲突问题导致部署效率低,打包方式是将项目打成一个war ...

  8. (原创)SpringBoot入门

    本文章是SpringBoot入门的介绍在这里   我会尽量写一些细节性的东西,我用的是IDEA2016  Tomcat7 JDK1.8 Maven3.3.9 IDEA Tomcat JDK Maven ...

  9. SpringBoot入门到精通_第6篇 _必知必会

    接上一篇:SpringBoot入门到精通_第5篇 _SpringBoot Actuator监控 https://blog.csdn.net/weixin_40816738/article/detail ...

  10. SpringBoot入门到精通_第5篇 _SpringBoot Actuator监控

    接上一篇:SpringBoot入门到精通_第4篇 _开发三板斧 https://blog.csdn.net/weixin_40816738/article/details/101097161 文章目录 ...

最新文章

  1. Matlab(一) .jpg转.ppm
  2. SparkStreaming运行出现 java.lang.NoClassDefFoundError: org/apache/htrace/Trace 错误
  3. STM32 电机教程 5 - 步进电机基础知识介绍
  4. windows10环境下安装Anaconda环境
  5. g5420核显驱动win7_9102年了,该怎么装Win7 ???
  6. ElasticSearch面试 - es 在数据量很大的情况下如何提高查询效率啊?
  7. .NET Core使用skiasharp文字头像生成方案(基于docker发布)
  8. 前端学习(1172):模板字符串
  9. 1、.Net Core 基础
  10. 避开Google Voice Search利用Google Speech API实现Android语音识别
  11. Atitit 企业知识管理PKM与PIM
  12. 最新 android 机型,安卓11支持哪些机型,Android11适配机型一览
  13. [BZOJ3162]独钓寒江雪
  14. Salesforce Apex 触发器学习记录
  15. android 防刷机
  16. SCI论文各部分的写作原则与注意点
  17. 通过单管道(pipe)实现两个进程间双向通信
  18. 【DIY文章列表标签】dt_gry_list
  19. 工贸企业重大事故隐患判定标准,自2023年5月15日起施行
  20. python分布式集群ray_取代Python多进程!伯克利开源分布式框架Ray

热门文章

  1. 号外 ! 号外 ! V7包下的View都来此参加同学会 , 快来看,快来看...
  2. 一篇文章带你解决 MongoDB 连接 localhost 和 127.0.0.1 可以连接,但是改成具体的IP地址就无法连接
  3. linux系统fasta程序,Linux生信练习2--fastq/fasta
  4. C/C++标准库之numeric
  5. linux广播命令,分享|在 Linux 终端收听广播
  6. 友盟分享 微博 c8998文件不存在
  7. visio图片导入word和PPT的最清晰的方式
  8. matlab存取面shp
  9. Npm配置全局安装插件目录以及命令用法扩展
  10. 智能交通 路侧智能感知 应用层数据格式