Springboot2.0学习总结
Spring框架
IOC控制反转:在IoC模式下,控制权限从应用程序转移到了IoC容器中。组件不是由应用程序负责创建和配置,而是由IoC容器负责。
使用IoC的情况下,对象是被动地接收依赖类而不是主动地查找。对象不是从容器中查找他的依赖类,而是容器在实例化对象时,主动地将他所依赖的对象注入给他。
应用程序只需要直接使用已经创建并且配置好的组件即可,而不必自己负责创建和配置。一般配置在我们的applicationContext.xml中,它其实就是一个控制器,
IOC依赖注入:也就是我们applicationContext.xml文件里面的控制规则,比如如何自动注入Bean,交给我们的spring容器来管理,全局扫描等。具体可以参考我的博客Spring框架章节。
AOP:也叫切面编程,配合我们的OOP面向对象编程使用,分为静态代理、动态代理、JDK动态代理、使用注解的方式实现动态代理。
SpringMVC框架
基于MVC运行:
基于SpringMVC运行:
从以上我们可以看出它们的区别,交给处理的机制不一样,返回的一个是Model一个ModelAndVIew。
那么我需要使用SpringMVC就需要配置,也是根据它的流程了配置的,以及它的RequstMapping等,具体可以参考我的博客SpringMVC系类文章。
SpringBoot基于Maven
说实话,不知道从何说起,干脆通过它的常用注解来讲解吧。
1)@Configuration,配置文件的注解,实现WebMvcConfiguration接口,它里面有诸多方法,比如添加一个拦截器addInterceptors,实习此方法,配置好属性,比如拦截那些路径,放行那些路径,在把你自己编写的拦截器放入,即可使用。
2)@component与@Bean,有时候分不清楚它的的区别,@Component是通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中。@Bean,注册到了spring上下文中,一般用来标注第三方类库,或者引用,也就是用来标注@Configuration注解下东西,把他们加到我们的spring容器中,两个注解都可以用@Autowired装配,我们需要使用直接,
@Autowired
RedisUrlConuntInterceptor redisUrlConuntInterceptor;
然后调用,很方便。
3)@Controller、@Service、@GetMapping、@PostMapping
4)@ResponseBody说明返回的只是JSON数据,在引入Thymeleaf模板,不加注解默认跳转页面
注册Servlet三大组件:
① 使用实现他们对应的接口,比如:Filter就实现Filter接口,@WebFilter(urlPatterns = {"/css/*"})来说拦截的路径,Servlet实现HttpServlet接口@WebServlet来说明请求路径,ServletContextListener实现ServletContextListener接口,需要使用@WebListener来注解;
在SpringBootApplication上使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。
②
@Configuration
public class MyRegisterConfig {
@Bean
public ServletRegistrationBean myServlet(){
MyServlet myServlet = new MyServlet();
return new ServletRegistrationBean(myServlet,"/my","/my02");
}
//@Bean
public FilterRegistrationBean myFilter(){
MyFilter myFilter = new MyFilter();
//根据其他的Servlet拦截的路径,过滤器也拦截相同的路径
/* return new FilterRegistrationBean(myFilter,myServlet());*/
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);
//自定义拦截路径
filterRegistrationBean.setUrlPatterns(Arrays.asList("/my","my02"));
return filterRegistrationBean;
}
@Bean
public ServletListenerRegistrationBean myListener(){
MyServletContextListener myServletContextListener = new MyServletContextListener();
return new ServletListenerRegistrationBean(myServletContextListener);
}
直接注册到容器中
LomBox插件,可以使我们的实体类类开发更简洁方便,
主要注解有:
@Data表示自动加载了GETSET方法,
@AllArgsConstructor:所有参构造函数
@NoArgsConstructor:空的构造函数等
整合MyBatis
需要在pom.xml中引入spring-boot-starter-data-jdbc,与mybatis-spring-boot-starter,
@MapperScan(“com.lsl.admin.Mapper”),在SpringBootApplication上使用@MapperScan注解可以扫描指定包下面的所有Mapping,不同我们一个一个的去写,
接下来说一个整合MyBatis后的使用方法,比如我们需要从数据库中根据ID查询某一条数据,
yaml配置文件:
spring:
datasource:
url: jdbc:mysql://192.168.1.38:3306/test1
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
#配置myBatis规则
mybatis:
#config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
configuration: #指定mybatis全局配置文件中的相关配置项
map-underscore-to-camel-case: true
Controller:
@Controller
public class CityController {
@Autowired
CityService cityService;
@ResponseBody
@GetMapping("/city")
public City getById(@RequestParam("id") int id){
return cityService.getCityById(id);
}
}
CityService
@Service
public class CityService {
@Autowired
CityMapper cityMapper;
public City getCityById(int id){
return cityMapper.getCity(id);
}
}
UserMapper
public interface CityMapper {
public City getCity(int id);
}
MyBatis配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--开启驼峰命名法,也可以在yaml中配置-->
<!--<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>-->
</configuration>
用来访问数据和映射给Mapping的配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lsl.admin.Mapper.CityMapper">
<!-- <insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into city(name,state,country)values(#{name},#{state},#{country});
</insert>-->
<select id="getCity" resultType="com.lsl.admin.Entity.City">
SELECT * FROM test1.city where id=#{id}
</select>
</mapper>
还可以在Mapping中直接采用注解的方式进行增删改,
@Insert("insert into city(name,state,country)values(#{name},#{state},#{country})")
@Options(useGeneratedKeys = true,keyProperty = "id")
public void insert(City city);
整合durid监控功能:
可以使用两种方式,不过都要先引入maven配置:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
随后可以使用@Configuration的方式
package com.lsl.admin.Config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Arrays;
/**
* 在配置文件中写会更简单
*/
//@Configuration
public class MyDataSourceConfig {
//默认的自动配置是判断容器中没有才会配
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
//加入sql监控功能
//druidDataSource.setFilters("stat,wall");
return druidDataSource;
}
//配置Druid监控页
@Bean
public ServletRegistrationBean statViewServlet(){
StatViewServlet servlet = new StatViewServlet();
ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(servlet, "/druid/*");
//配置durid的登录功能
registrationBean.addInitParameter("loginUsername","admin");
registrationBean.addInitParameter("loginPassword","123");
return registrationBean;
}
/**
* WebStatFilter 用于采集web-jdbc关联监控的数据
*
*/
@Bean
public FilterRegistrationBean webStatFilter(){
WebStatFilter webStatFilter = new WebStatFilter();
FilterRegistrationBean<WebStatFilter> filterRegistrationBean = new FilterRegistrationBean<>(webStatFilter);
filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
也可以使用yaml配置:
druid:
stat-view-servlet:
enabled: true
login-username: admin
login-password: 123
resetEnable: false
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
aop-patterns: com.lsl.admin.*
filters: stat,wall
filter:
stat:
slow-sql-millis: 1000
log-slow-sql: true
enabled: true
wall:
enabled: true
config:
drop-table-allow: false
整合MyBatis-Puls,同时引入了start-JDBC和start-mybaits.
引入:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
可以混合使用,不过它的mybatis配置文件映射规则,默认在resource下的mapper路径下,也可以只用puls,看个人需求.
使用:从数据库查询某一张表的数据
@Autowired
UserService userService;
List<User> list = userService.list();//list方法由我们的mybatis-puls提供
UserSevice接口:
public interface UserService extends IService<User> {
//IService是service的总接口,里面有很多增删改查的方法,我们controller里面的list方法就是从这里调出去的
}
UserServiceImpl
@Service
public class UserServiceimpl extends ServiceImpl<UserMapper,User> implements UserService {
//实现UserService接口,UserService接口又实现的IService接口,那么我们是不是要实现IService接口的所有方法才能使用?不需要,因为我们有ServiceImpl类这个类实现了IService接口的所有方法,我们继承这个类就欧克了.
Junit5:断言,前置,嵌套,参数测试,迁移等.
指示监控没有认真学习.后续会补,加油打工仔.