框架类技术问题集锦-1
# 框架类技术问题集锦-1
# SpringBoot系列
# springboot跟spring有什么区别?
springboot是对spring框架的一个整合,是一个微服务框架。 为什么说它是整合?因为使用它 可以让我们用很少的一部分配置实现一个项目(实现很多功能)
为什么用很少的配置就行?因为它最重要的特性:自动配置
自动配置思想:一个项目要有这些功能必须要在创建工程的时候自动把对应的类实例化并加入到spring容器中,这个就是约定大于配置
具体实现: 导入对应的starter(SpringBoot中对于一些配置 用Java代码方式来实现),编写必要的配置文件 此外它还内嵌了Tomcat\Jetty服务器
# springboot中starter的作用?
starter是springboot 四大核心功能特性之一,还有 自动装配、Actuator监控以及命令界面
作用:为了使用者关心业务逻辑,减少对配置和外部环境的依赖
首先说下它的概念:
Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境( 条件)进行自动配置。使用者只需要依赖相应功能的Starter,无需做过多的配置和依赖,Spring Boot就能自动扫描并加载相应的模块。
starter内部集成了自动装配机制,就是说项目中依赖对应的starter组件以后,这个组件会自动集成到Spring生态下,对于相关Bean的管理,也是基于自动装配机制来完成,我们只需要写少量的配置在application.properties文件进行维护就好
# 什么是自动装配,它有哪些方式?
Spring框架中的自动装配(autowiring)是一种通过DI(依赖注入)机制,在应用程序启动时自动将指定类型的bean引入到其它bean中,并为各个属性赋值的过程。
通俗易懂的讲,就是程序运行时,自动创建需要的类并自动赋值的过程。而自动赋值这个过程这就是依赖注入。
Spring提了三种注入bean对象的方式:
- 隐式的bean扫描发现机制和自动装配
- 在java中进行显示配置
- 在XML中进行显示配置
比如:当对一个类标注@Component
、@Controller
等注解时,表明该类会作为组件类,spring将为这个类创建bean
一般通过组件扫描和自动装配方式就比较方便了,但如果由于需求我们要使用第三方的库的类,在这种情况没有办法到第三方库中去给类加注解,就不能使用第一种方法了。这时得采用显示装配,可以采用java代码或xml显示装配bean。使用java代码,先新建一个配置类JavaConfig,里面都是配置所需的bean,不应该有业务逻辑代码,所以单独建一个类。
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
//以方法名作为组件的id。
//返回类型就是组件类型。
//返回的值,就是组件在容器中的实例
}
2
3
4
5
6
7
8
9
10
11
或者使用xml配置:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context">
<import resource="spring/spring-dao.xml"/>
<bean id="postservice" class="com.bbs.service.impl.PostserviceImpl">
<constructor-arg ref="postdao"/>
<constructor-arg ref="userdao"/>
</bean>
</beans>
2
3
4
5
6
7
8
9
10
11
12
13
# SpringBoot是如何启动?
springboot是通过main方法下的SpringApplication.run方法启动的,
- 启动的时候他会调用refshContext方法,先刷新容器,然后根据解析注解或者解析配置文件的形式注册bean,
- 而它是通过启动类的SpringBootApplication注解进行开始解析的,他会根据EnableAutoConfiguration开启自动化配置,
- 里面有个核心方法ImportSelect选择性的导入,
- 由loadFanctoryNames根据classpash路径以
MATA-INF/spring.factorces
下面以什么什么EnableAutoConfiguration
开头的key去加载里面所有对应的自动化配置,
- 他并不是把这一百二十多个自动化配置全部导入,在他每个自动化配置里面都有条件判断注解,先判断是否引入相互的jar包,再判断容器是否有bean再进行注入到bean容器
# 在静态资源文件夹添加了文件,无法立即访问?
如果访问项目中的静态资源,访问的所有东西其实都是在target目录中的,是经过编译的,如果对项目——目录下的静态资源进行修改(增删改),由于target下的东西没有受影响,所有没办法立即生效,
比如往/resouces/static下增加一张图片,通过url无法立即访问到,必须重启项目。其实重启就是让资源文件经过编译(其实资源文件根本不编译)后,重新检查资源文件并加到target中
# SpringBoot静态资源的导入
使用静态资源的模式-一般常用于:前后端不分离模式
- Static ——放置静态资源
- Templates ——放模版,也就是网页
静态资源文件夹
通过看源码能发现,定义的静态资源路径还有4个
classpath:/pulic/
\ /static/
\ /resources/
上面三个的优先级 resources最高,public最低
/META-INF/resources/ (这个就是webjars)
对应的配置文件处的配置,可自行定义
spring.resources.static-locations= classpath:/coding/,classpath:/demo/
springboot项目下的templates目录的资源默认是受保护的,没有开放访问权限 ——因为是放置模板的文件夹,需要视图解析器来解析,必须通过服务器内部进行访问 【访问方法】
- 在application.yml或者application.properties配置文件中将访问权限开放(不推荐)
- 通过Controller控制器层跳转访问的资源(推荐)
# Spring怎么使用事务?
Spring 支持两种事务方式,分别是编程式事务和声明式事务:
- 声明式事务最便捷的方式就是,直接在对应方法上加
@Transactional
就可实现
@Transactional
注解默认使用的是DataSourceTransactionManager作为事务管理器,这是一个基于JDBC DataSource的事务管理器,能够管理本地事务。 当应用程序启动时,Spring Boot会自动检测DataSource的存在,并根据需要创建和配置相关的事务管理器。
- 编程式事务
方法一:通过 TransactionTemplate
来管理事务
@Autowired
private TransactionTemplate transactionTemplate;
public void testTransaction() {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
try {
// .... 业务代码
} catch (Exception e){
//回滚
transactionStatus.setRollbackOnly();
}
}
});
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
方法二:使用 TransactionManager
来管理事务:
@Autowired
private PlatformTransactionManager transactionManager;
public void testTransaction() {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
// .... 业务代码
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
}
}
2
3
4
5
6
7
8
9
10
11
12
13