1.什么是SpringBoot?他和别的框架相比有什么优势?
他是一个Spring团队开发的,简化Spring项目开发的框架,能够让开发人员快速上手,使用少量的代码进行开发程序。
2.SpringBoot的特点和功能?
(1)能够独立创建Spring项目
(2)整合了Tomcat、jetty等WEB容器,不用部署War包
(3)提供Starter依赖进行简化Spring的配置
(4)提供了生产级别功能:监控、健康检查和外部化配置
(5)不需要XML的配置
3.SpringBoot怎么解决跨域问题?
(1)跨域问题是什么导致的?
浏览器的同源策略
同源的定义如果两个 URL 的协议、端口(如果有指定的话)和主机都相同的话,则这两个 URL 是同源的。
方法一:过滤器
public class CrossDomainFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse resp = (HttpServletResponse)response;
resp.setHeader("Access-Control-Allow-Origin","*");
resp.setHeader("Access-Control-Allow-Methods","GET,POST,DELETE,PUT,OPTIONS");
resp.setHeader("Access-Control-Allow-Headers","*");
resp.setHeader("Access-Control-Max-Age","3600");
chain.doFilter(request,resp);
}
在config中配置过滤器
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Bean
public FilterRegistrationBean<CrossDomainFilter> register(){
FilterRegistrationBean<CrossDomainFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new CrossDomainFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.setOrder(-100);
return registrationBean;
}
}
4.Spring事务有几种方式?
Spring事务分为两种,一种是编程式事务(在开发中,很少用到,这里不再赘述),另一种是AOP声明式事务
声明式事务
(1)采用xml配置文件,进行配置
<!-- 事务管理器 DataSourceTransactionManager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- transaction-manager默认到Ioc中查找id为transactionManager的事务管理器 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 对哪些方法执行事务,配置事务定义信息(隔离级别、传播行为、是否只读、超时时间、回滚机制)-->
<!-- 1. name属性: 为哪些方法添加事务 -->
<!-- 2. isolation属性: 使用什么隔离级别,这里有5种配置方式 -->
<!-- 3. propagation属性:配置事务的传播行为 -->
<!-- 4. timeout属性:-1:表示永不超时;3:3秒钟超时 -->
<!-- 5. read-only属性 -->
<!-- 6. rollback-for属性:指定对哪些异常起作用 -->
<!-- 7. no-rollback-for属性:指定对哪些异常不起作用 -->
<tx:method name="add*" rollback-for="Throwable"/>
<tx:method name="save*" rollback-for="Throwable"/>
<tx:method name="update*" rollback-for="Throwable"/>
<tx:method name="del*" rollback-for="Throwable"/>
<tx:method name="transfer" rollback-for="Throwable"/>
<tx:method name="increase" rollback-for="Throwable"/>
<tx:method name="decrease" propagation="REQUIRED" rollback-for="Throwable"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.etoak.service..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>
(2)采用注解的方式配置
首先在配置文件里(spring.xml)添加事务管理器(DataSourceTransactionManager)以及开启注解事务,然后再在相应的实现类上加上@Transactional注解,开启事务
<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
@Transactional(propagation = Propagation.REQUIRED,
isolation = Isolation.DEFAULT,
rollbackFor = Exception.class)
@Override
public void transfer(int increaseId, int decreaseId, int money) throws SQLException {
userService.increase(increaseId, money);
userService.decrease(decreaseId, money);
// int i = 1 / 0;
throw new SQLException("111111");
}
5.Spring事物的隔离级别有几个?默认是哪一种?
Spring事物的隔离级别有5种
DEFAULT 默认使用数据库的隔离级别
mysql:REPEATABLE_READ(可重复读) oracle:READ_COMMITTED(已提交读)
READ_UNCOMMITTED
READ_COMMITTED
REPEATABLE_READ
SERIALIZABLE
6.Spring事务的传播行为、传播特性、传播机制 ,以及支持多少种传播行为?
Spring支持七种传播特性:
1.REQUIRED : 表示如果当前存在一个事务,则加入该事务,否则将新建一个事务,这个Spring事务默认传播行为。
2. REQUIRES_NEW :表示不管是否存在事务,都创建一个新的事务,把原来的事务挂起,新的事务执行完毕,继续执行老的事务;
3.SUPPORTS: 表示如果当前存在事务,就加入该事务;如果当前没有事务,那就不使用事务;
4.NOT_SUPPORTED:表示不使用事务,如果当前存在事务,就把当前事务暂停,以非事务方式执行
5.MANDATORY : 表示必须在一个已有的事务中执行,如果当前没有事务,则抛出异常:
6.NEVER : 表示以非事务方式执行,如果当前存在事务,则抛出异常:
7. NESTED: 这个是嵌套事务。如果当前存在事务,则在嵌套事务内执行;如果当前不存在事务,则创建一个新的事务;嵌套事务使用数据库中的保存点来实现,即嵌套事务回滚不影响外部事务但外部事务回滚将导致嵌套事务回滚。
Spring事务的回滚规则:
7.事务不生效的两种情况?
(1)同一个Service中的两个方法,没有事务的方法调用有事务的方法,没有事务的方法报异常.
解决方法: 重新注入一个当前类型的代理对象
(2)默认情况下抛出非运行时异常。
解决方法:rollbackFor