SpringBoot 入门
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 入门相关推荐
- SpringBoot入门(二)——起步依赖
本文来自网易云社区 在前一篇我们通过简单几步操作就生成了一个可以直接运行的Web程序,这是因为SpringBoot代替我们做了许多工作,概括来讲可以分为起步依赖和自动配置.这一篇先来看看起步依赖. 项 ...
- springboot 入门教程(4)--web开发(spring mvc和Thymeleaf模板,带源码)
2019独角兽企业重金招聘Python工程师标准>>> 首先回顾下前几篇的内容:springboot 入门教程(1),springboot 入门教程-Thymeleaf(2), sp ...
- 【Java】SpringBoot入门学习及基本使用
SpringBoot入门及基本使用 SpringBoot的介绍我就不多说了,核心的就是"约定大于配置",接下来直接上干货吧! 本文的实例: github-LPCloud,欢迎sta ...
- SpringBoot入门和配置
一.SpringBoot入门和微服务简介 1.SpringBoot入门 springboot:J2EE一站式解决方案 springcloud:分布式整体解决方案 2.微服务简介 微服务:架构风 ...
- 最简单最详细的SpringBoot入门项目——HelloWorld
最详细的SpringBoot入门项目--HelloWorld 关于SpringBoot的介绍以及优点这里就不说了,想了解的可以直接点击这里 Spring Boot百度百科 接下来我们直奔主题,开始用S ...
- SpringBoot简介、SpringBoot 入门程序搭建、与JDBC、Druid、Mybatis和SpringData JPA的整合
一.SpringBoot 简介: spring boot并不是一个全新的框架,它不是spring解决方案的一个替代品,而是spring的一个封装.所以,你以前可以用spring做的事情,现在用spri ...
- springboot 历史版本文档_乘风破浪,SpringBoot入门
SpringBoot入门篇 前言 在普通的java项目中,大量的xml文件配置起来相当繁琐,导致了开发效率非常低下,整合第三方框架的配置可能会存在冲突问题导致部署效率低,打包方式是将项目打成一个war ...
- (原创)SpringBoot入门
本文章是SpringBoot入门的介绍在这里 我会尽量写一些细节性的东西,我用的是IDEA2016 Tomcat7 JDK1.8 Maven3.3.9 IDEA Tomcat JDK Maven ...
- SpringBoot入门到精通_第6篇 _必知必会
接上一篇:SpringBoot入门到精通_第5篇 _SpringBoot Actuator监控 https://blog.csdn.net/weixin_40816738/article/detail ...
- SpringBoot入门到精通_第5篇 _SpringBoot Actuator监控
接上一篇:SpringBoot入门到精通_第4篇 _开发三板斧 https://blog.csdn.net/weixin_40816738/article/details/101097161 文章目录 ...
最新文章
- Matlab(一) .jpg转.ppm
- SparkStreaming运行出现 java.lang.NoClassDefFoundError: org/apache/htrace/Trace 错误
- STM32 电机教程 5 - 步进电机基础知识介绍
- windows10环境下安装Anaconda环境
- g5420核显驱动win7_9102年了,该怎么装Win7 ???
- ElasticSearch面试 - es 在数据量很大的情况下如何提高查询效率啊?
- .NET Core使用skiasharp文字头像生成方案(基于docker发布)
- 前端学习(1172):模板字符串
- 1、.Net Core 基础
- 避开Google Voice Search利用Google Speech API实现Android语音识别
- Atitit 企业知识管理PKM与PIM
- 最新 android 机型,安卓11支持哪些机型,Android11适配机型一览
- [BZOJ3162]独钓寒江雪
- Salesforce Apex 触发器学习记录
- android 防刷机
- SCI论文各部分的写作原则与注意点
- 通过单管道(pipe)实现两个进程间双向通信
- 【DIY文章列表标签】dt_gry_list
- 工贸企业重大事故隐患判定标准,自2023年5月15日起施行
- python分布式集群ray_取代Python多进程!伯克利开源分布式框架Ray
热门文章
- 号外 ! 号外 ! V7包下的View都来此参加同学会 , 快来看,快来看...
- 一篇文章带你解决 MongoDB 连接 localhost 和 127.0.0.1 可以连接,但是改成具体的IP地址就无法连接
- linux系统fasta程序,Linux生信练习2--fastq/fasta
- C/C++标准库之numeric
- linux广播命令,分享|在 Linux 终端收听广播
- 友盟分享 微博 c8998文件不存在
- visio图片导入word和PPT的最清晰的方式
- matlab存取面shp
- Npm配置全局安装插件目录以及命令用法扩展
- 智能交通 路侧智能感知 应用层数据格式