2023/4/27复习下Springboot
SpringBoot 就相当于 不需要配置文件的Spring+SpringMVC
一.重要注解
1.JavaConfig: 使用java类作为xml配置文件的替代, 是配置spring容器的纯java的方式。 在这个java类这可以创建java对象,把对象放入spring容器中(注入到容器)
(1)@Configuration : 放在一个类的上面,表示这个类是作为配置文件使用的
(2)@Bean
2.@ImporResource (了解)导入其他的xml配置文件
3.@PropertyResource(了解)读取properties属性配置文件
4.@SpringBootApplication (核心注解)
复合注解:由
(1)@SpringBootConfiguration
使用了@SpringBootConfiguration注解标注的类,可以作为配置文件使用的,可以使用Bean声明对象,注入到容器
(2)@EnableAutoConfiguration
启用自动配置, 把java对象配置好,注入到spring容器中。例如可以把mybatis的对象创建好,放入到容器中
(3)@ComponentScan 扫描器
找到注解,根据注解的功能创建对象,给属性赋值等等。
默认扫描的包: @ComponentScan所在的类所在的包及其子包。
5.@ConfigurationProperties: 把配置文件的数据映射为java对象。
属性:prefix 配置文件中的某些key的开头的内容。
@Component
@ConfigurationProperties(prefix = "school")
public class SchoolInfo {
private String name;
private String website;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWebsite() {
return website;
}
public void setWebsite(String website) {
this.website = website;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "SchoolInfo{" +
"name='" + name + '\'' +
", website='" + website + '\'' +
", address='" + address + '\'' +
'}';
}
}
application.properties
#配置端口号
server.port=8082
#context-path
server.servlet.context-path=/myboot
#自定义key=value
school.name=动力节点
school.website=www.bjpowernode.com
school.address=北京的大兴区
site=www.bjpowernode.com
6.汇总
创建对象的:
@Controller: 放在类的上面,创建控制器对象,注入到容器中
@RestController: 放在类的上面,创建控制器对象,注入到容器中。
作用:复合注解是@Controller , @ResponseBody, 使用这个注解类的,里面的控制器方法的返回值 都是数据
@Service : 放在业务层的实现类上面,创建service对象,注入到容器
@Repository : 放在dao层的实现类上面,创建dao对象,放入到容器。 没有使用这个注解,是因为现在使用MyBatis框 架, dao对象是MyBatis通过代理生成的。 不需要使用@Repository、 所以没有使用。
@Component: 放在类的上面,创建此类的对象,放入到容器中。
赋值的:
@Value : 简单类型的赋值, 例如 在属性的上面使用@Value("李四") private String name
还可以使用@Value,获取配置文件者的数据(properties或yml)。
@Value("${server.port}") private Integer port
@Autowired: 引用类型赋值自动注入的,支持byName, byType. 默认是byType 。 放在属性的上面,也可以放在构造 方法的上面。 推荐是放在构造方法的上面
@Qualifer: 给引用类型赋值,使用byName方式。
@Autowird, @Qualifer都是Spring框架提供的。
@Resource : 来自jdk中的定义, javax.annotation。 实现引用类型的自动注入, 支持byName, byType.
默认是byName, 如果byName失败, 再使用byType注入。 在属性上面使用
其他:
@Configuration : 放在类的上面,表示这是个配置类,相当于xml配置文件
@Bean:放在方法的上面, 把方法的返回值对象,注入到spring容器中。
@ImportResource : 加载其他的xml配置文件, 把文件中的对象注入到spring容器中
@PropertySource : 读取其他的properties属性配置文件
@ComponentScan: 扫描器 ,指定包名,扫描注解的
@ResponseBody: 放在方法的上面,表示方法的返回值是数据, 不是视图
@RequestBody : 把请求体中的数据,读取出来, 转为java对象使用。
@ControllerAdvice: 控制器增强, 放在类的上面, 表示此类提供了方法,可以对controller增强功能。
@ExceptionHandler : 处理异常的,放在方法的上面
@Transcational : 处理事务的, 放在service实现类的public方法上面, 表示此方法有事务
SpringBoot中使用的注解
@SpringBootApplication : 放在启动类上面, 包含了@SpringBootConfiguration
@EnableAutoConfiguration, @ComponentScan
MyBatis相关的注解
@Mapper : 放在类的上面 , 让MyBatis找到接口, 创建他的代理对象
@MapperScan :放在主类的上面 , 指定扫描的包, 把这个包中的所有接口都创建代理对象。 对象注入到容器中
@Param : 放在dao接口的方法的形参前面, 作为命名参数使用的。
Dubbo注解
@DubboService: 在提供者端使用的,暴露服务的, 放在接口的实现类上面
@DubboReference: 在消费者端使用的, 引用远程服务, 放在属性上面使用。
@EnableDubbo : 放在主类上面, 表示当前引用启用Dubbo功能。
二、Springboot项目结构
三、Springboot的配置文件
配置文件名称: application
扩展名有: properties( k=v) ; yml ( k: v)
使用application.properties, application.yml
3.1多环境配置(面试题)
有开发环境, 测试环境, 上线的环境。
每个环境有不同的配置信息, 例如端口, 上下文件, 数据库url,用户名,密码等等
使用多环境配置文件,可以方便的切换不同的配置。
使用方式: 创建多个配置文件, 名称规则: application-环境名称.properties(yml)
创建开发环境的配置文件: application-dev.properties( application-dev.yml )
创建测试者使用的配置: application-test.properties
然后在application.properties/yml
spring:
profiles:
active: dev
四、Spring Boot 中使用 ApplicationContext 手工获取容器中的对象(了解)
你想通过代码,从容器中获取对象。
通过SpringApplication.run(Application.class, args)的返回值获取容器对象。
ConfigurableApplicationContext : 接口,是ApplicationContext的子接口
public interface ConfigurableApplicationContext extends ApplicationContext
例如:
@SpringBootApplication
public class A010SpringbootContainerApplication {
public static void main(String[] args) {
//获取容器对象
ConfigurableApplicationContext run = SpringApplication.run(A010SpringbootContainerApplication.class, args);
UserService userServiceImpl = (UserService) run.getBean("userServiceImpl");
userServiceImpl.sayHello("李四");
}
}
五、ComnandLineRunner 接口 , ApplcationRunner接口(了解)
开发中可能会有这样的情景。需要在容器启动后执行一些内容(某个时机?)。比如读取配置文件,数据库连接之类的。SpringBoot 给我们提供了两个接口来帮助我们实现这种需求。这两个接口 分别为 CommandLineRunner 和 ApplicationRunner。他们的执行时机为容器启动完成的时候。 这两个接口中有一个 run 方法,我们只需要实现这个方法即可。这两个接口的不同之处在于: ApplicationRunner 中 run 方 法 的 参 数 为 ApplicationArguments , 而 CommandLineRunner 接口中 run 方法的参数为 String 数组
总结:
这两个接口都 有一个run方法。 执行时间在容器对象创建好后, 自动执行run()方法。我们只需要实现run方法即可
可以完成自定义的在容器对象创建好的一些操作。
例子:
@SpringBootApplication
public class A011SpringbootRunnerApplication implements CommandLineRunner {
@Autowired
private HelloService helloService;
public static void main(String[] args) {
System.out.println("准备创建容器对象");
SpringApplication.run(A011SpringbootRunnerApplication.class, args);
System.out.println("创建容器对象之后");
}
@Override
public void run(String... args) throws Exception {
String lisi = helloService.sayHello("Lisi");
System.out.println(lisi);
//可做自定义的操作,比如读取文件
System.out.println("在容器对象创建好之后,执行的方法");
}
}
六、Web组件——拦截器
和springmvc的拦截器对比一下
使用:
(1)(web文件夹下) 创建类实现 HandlerInterceptor 接口 (和springmvc相同)
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("LoginInterceptor的preHandle方法执行啦");
return true;
}
}
(2) 注册拦截器对象 (相当于之前在xml中的配置)
注意(来自我的路径专题):
具体路径后面带一个*:能拦截这个具体路径的子女节点;
具体路径后面带两个*:能拦截这个具体路径的所有后代节点(包括这个具体路径自己,但当具体路径是"/"时,则无需被拦截)。
@Configuration
public class MyAppConfig implements WebMvcConfigurer {
/**
* 添加拦截器对象 以前是在xml中配置
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//创建拦截器对象
HandlerInterceptor hi = new LoginInterceptor();
//指定拦截的url
String[] path = {"/user/**"};
//不拦截的地址
String[] exclude = {"/user/login"};
registry.addInterceptor(hi)
.addPathPatterns(path)
.excludePathPatterns(exclude);
}
}
七、过滤器
使用
(1)(web文件下)创建 Filter 对象
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("执行了MyFilter");
filterChain.doFilter(request,response);
}
}
(2)注册 Filter (瑞吉外卖和这里的配置不同 是通过一个注解 复习到再回来补充)
注意: urlPattern (同样来自我的路径专题 和拦截器不一样)
<url-pattern>/</url-pattern>
:
会匹配到/springmvc这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url。仅仅是路径
<url-pattern>/*</url-pattern>
:
会匹配所有的url:路径型的和后缀型的url(包括/springmvc,.jsp,.js和*.html等) 路径加页面
@Configuration
public class WebapplicationConfig {
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new MyFilter());
bean.addUrlPatterns("/user/*");
return bean;
}
}
字符集过滤器的应用(略)
八、 SpringBoot +MyBatis
注意是mybatis 和Mybatis Plus还是不太一样的
1.@MapperScan和Mapper
可以参考@Mapper 与 @MapperScan 的区别_猎人在吃肉的博客-优快云博客
在 Dao 接口上面加入@Mapper,需要在每个接口都加入注解。当 Dao 接口多的时候不方便。
可以使用如下的方式解决。 主类上添加注解包扫描:@MapperScan("com.bjpowernode.dao")
(瑞吉外卖既有mapperscan又有mapper 建议用了mapperscan就不要用mapper了 )
2.mapper 文件和 java 代码分开管理
➢ 在 resources 创建自定义目录,例如 mapper, 存放 xml 文件
➢ 把原来的 xml 文件剪切并拷贝到 resources/mapper 目录
➢ 在 application.properties 配置文件中指定映射文件的位置,这个配置只有接口和映射文件不在同一个包的情况下,才需要指定。
#指定mapper文件的位置
mybatis.mapper-locations=classpath:mapper/**.xml
3.事务支持
代码:a019-springboot-tran 事务 注意这里逆向工程的使用
可以看一下八股
运行A019的代码 有这样一个疑惑
"无论是运行时/编译时异常 ,throw抛出异常后代码停止,try-catch-finally解决后代码继续运行"
这里并不是说整个程序会宕掉, 特殊: 对于编译时异常 如果在main中仍然上抛(抛给了JVM)那么会宕掉 。重点是发生异常处后面的代码会不会执行 (至于spring(boot)整个程序会不会宕 目前不清楚)
对于FileInputStream这个检查时异常也是可以在controller中抛出的 同样 会返回原生错误信息到客户端 那么我认为对于检查时异常也是可以用统一异常处理
理解:
通常会将事务配置在 Service 层, 当数据库操作失败时, 让 Service 层抛出运行时异常, 而不进行 try-catch 处理, Spring 事物管理器就会进行回滚. 为了事务回滚
但 Service 层抛出后. 在 Controller 层就需要 try-catch 去捕获异常, 否则会返回原生错误信息到客户端(如下图). 但是, 如果在 Controller 层的每个方法体里面都写一些模板化的 try-catch 的代码, 代码不但不美观, 也增加了维护的难度, 特别是还需要对 Service 层的不同异常进行不同处理的时候. 因此 统一异常处理
九、RESTful
9.1概念
REST : (英文: Representational State Transfer , 中文: 表现层状态转移)是一种接口的架构风格和设计的理念,不是标准。优点: 更简洁,更有层次
一句话概括:使用http中的动作(请求方式), 表示对资源的操作(CURD)
9.2通过5个重要注解来实现的
(1) @PathVariable (一般传的参数不是数据库表的字段,可以不采用斜杠)
(2) @PostMapping
(3) @DeleteMapping
(4) @PutMapping
(5) @GetMapping
保证url+请求方式唯一 , 否则会产生歧义
9.3 在页面中或者ajax中,支持put,delete请求
了解 具体看笔记
补充问题
1.working directory
注意下图的
"src\\main\\resources\\a02.xml" 和 D:\java动力节点\Spring_gaoji\code\show
前者是相对路径 后者是起始路径