Spring Boot
1.自动配置原理
启动类:
@SpringBootApplication
public class Application{
public static void main(Sting[] args){
SpringApplication.run(Application.class, args);
}
}
①注解:
@SpringBootApplication组合注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
解释:
@SpringBootConfiguration:如果用了SpringBootApplication就会被spring当作一个配置类;
@EnableAutoConfiguration:辨别标注了@Configuration注解的类,识别扫描到这些配置类;
@ComponentScan:是一个组件扫描,扫描当前包及其子包里面使用了Spring注解的一些组件
②main方法:
SpringApplication.run()方法,里面会有getSpringFactoriesInstances()方法,获取工厂实例
->加载了工厂名称(loadFactoryNames)
->spring.factories(定义了非常多的自动整合的类,组件:springMVC,redis,数据库的等)
(@ConditionalOnClass/OnWebApplication条件注解,如果满足了就会实例化该类)
③如果需要修改组件配置
总结:
1.在'MEtA-INF\Spring.factories'文件中定义了很多自动配置类;
2.可以根据在pom.xml文件中添加的启动器依赖自动配置组件;
3.通过如下流程可以修改application配置文件,改变自动配置的组件默认参数:
2.Spring Boot整合SSM框架
①lombok应用
使用lombok的注解实现pojo类的简化
使用SpringBoot整合SSM工程;需要使用到数据库数据。
*.将数据库表数据导入到数据库中(springboot_test);
*.编写数据库表对应的实体类;一般情况下需要编写get/set/toString等方法会耗时并且会让实体类看起来比较臃肿。可以使用lombok插件对实体类进行简化。
lombok是一个插件工具类包,提供了一些注解@Data、@Getter等这些注解去简化实体类中的构造方法、get/set等方法的编写。
1.在IDEA中安装lombok插件;
2.添加lombok对应的依赖到项目pom.xml文件;
org.projectlombok
lombok
3.改造实体类使用lombok注解。
在编译阶段会根据注解自动生成对应的方法
实体类注解:
@Data(get、set、hashCode、equals、toString等方法)
@Getter(自动提供getter方法)
@Setter(自动提供setter方法)
@NoArgsConstructor(为类提供一个无参的构造方法)
@AllArgsConstructor(为类提供一个全参的构造方法)
@Slfj(自动在bean中提供log变量,其实用的是slf4j的日志功能)等
②Spring Boot整合-SpringMVC端口和静态资源
1.修改tomcat端口
查询***.Properties,设置配置项(前缀名+类变量名)到application配置文件中。
autoconfigure:2.1.5.RELEASE->web->ServerProperties(前缀server)
2.访问项目中的静态资源
静态资源放置的位置;放置静态资源并访问这些资源。
autoconfigure:2.1.5.RELEASE->web->ResourProperties(classPath:/META-INF/resources/;
classPath:/resources/;
classPath:/static/;
classPath:/public/)
③Spring Boot 整合-springMVC拦截器
可以把Spring Boot项目中配置自定义SpringMVC拦截器
1.编写拦截器(实现一个接口HandlerIntercepter);
2.编写配置类实现WebMvcConfigurer,在该类中添加各种组件;
④Spring Boot整合-事务和连接池
配置Spring Boot自带默认的hikari数据库连接池和使用@Transactional注解进行事务配置
*.事务配置
1.添加事务相关的启动器依赖,mysql相关依赖;
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-conector-java
5.1.46
2.编写业务类UserService使用事务注解@Transactional
*.数据库连接池hikari配置
因为是自带默认的,所以只需要在application配置文件中指定数据库相关参数
⑤Spring Boot整合-Mybatis
配置Mybatis在Spring Boot工程中的整合包,设置Mybatis的实体类别名,输出执行sql语句配置项
1.添加启动器依赖;
org.mybatis.spring.boot
mybatis-spring-nppt-starter
2.0.1
2.配置Mybatis:实体类别名包,日志,映射文件等;
Mybatis.type-aliases-package:cn.yang.pojo
Mybatis.mapper-locations:classpath:mappers/*.xml
Mybatis.configuration.log-impl:org.apache.ibatis.logging.stdout.StdOutImpl
3.配置MapperScan
@SpringBootApplication
//扫描mybatis所有业务mapper接口
@MapperScan("cn.yang.mapper")
public class Application{
public static void main(Sting[] args){
SpringApplication.run(Application.class, args);
}
}
⑥Spring Boot整合-通用Mapper
配置通用Mapper组件到Spring Boot项目中并使用Mapper接口
通用Mapper:可以实现自动拼接sql语句;所有mapper都不需要编写任何方法也就是不用编写sql语句。可以提高开发效率。
1.添加启动器依赖;
tk.mybatis
mapper-spring-boot-starter
2.1.5
2.改造UserMapper继承Mapper;
extends Mapper
3.修改启动引导类Application中的Mapper扫描注解;
@SpringBootApplication
@MapperScan("cn.yang.mapper")
public class Application{
public static void main(Sting[] args){
SpringApplication.run(Application.class, args);
}
}
4.修改User实体类添加jpa注解;
@Table(name = "tb_user")
@Id
@KeySql(useGeneratedKeys = true) //主键回填
@Colum(name = "abc") //不符合的驼峰的加
5.改造UserService实现业务功能;
@Autowired
private UserMapper userMapper;
punlic User queryById(Long id){
return userMapper.selectByPrimaryKey(id);
}
public void saveUser(User user){
userMapper.insertSelective(user);
}
⑦Spring Boot整合-Junit
在Spring Boot项目中使用Junit进行单元测试UserService的方法
1.添加启动器依赖;spring-boot-starter-test
2.编写测试类
⑧Spring Boot整合-redis
在Spring Boot项目中使用Junit测试Redis Template的使用
1.添加启动器依赖;spring-boot-starter-data-redis
2.配置application.yml中修改redis的连接参数;(redis需要启动)
#修改主机地址
spring.redis.host:localhost
spring.redis.port:6379
3.编写测试类应用RedisTemplate操作redis中的五种数据类型(String\hash\set\list\sorted set)
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest{
@Autowired
private RedisTemplate redisTemplate;
public void test(){
redisTemplate.boundValueOps("str").set("baba");
System.out.println("str = " + redisTemplate.opsForValue.get("str"));
redisTemplate.boundHashOps("h_key").put("name","baba");
redisTemplate.boundHashOps("h_key").put("age","18");
Set set = redisTemplate.boundHashOps("h_key").keys();
System.out.println("hash散列的所有域:" + set);
List list = redisTemplate.boundHashOps("h_key").values();
redisTemplate.boundListOps("l_key").leftPush("c");
redisTemplate.boundListOps("l_key").leftPush("b");
redisTemplate.boundListOps("l_key").leftPush("a");
list = redisTemplate.boundListOps("l_key").range(0,-1);
System.out.println("list列表中所有的元素 : " + list)
redisTemplate.boundSetOps("s_key").add("a","b","c");
set = redisTemplate.boundSetOps("s_key").members();
System.out.println("set集合中的所有元素 : " + set)
redisTemplate.boundZSetOps("z_key").add("a","30");
redisTemplate.boundZSetOps("z_key").add("b","20");
redisTemplate.boundZSetOps("z_key").add("c","10");
set = redisTemplate.boundZSetOps("z_key").range(0,-1);
System.out.println("zset有序集合中所有元素 :" + set);
}
}