1、Spring的基本概念及其优点
基本概念:Spring是分层的java SE/EE应用一站式的轻量级开源框架,以 IOC (控制反转) 和 AOP (切面编程) 为核心,提供了展现层Spring MVC ,持久层Spring JDBC 及业务事务管理等技术。
优点:
- 简化开发,解耦,集成其它框架。
- 低侵入式设计,代码污染级别级别。
- Spring的DI机制降低了业务对象替换的复杂性,提高了软件之间的解耦。
- Spring AOP支持将一些通用的任务进行集中式的管理,例如:安全,事务,日志等,从而使代码能更好的复用。
2、Spring Boot的特性
Spring CLI:允许使用 Groovy 编写 Spring 引导应用程序,并避免了样板代码。
启动依赖项:在此功能的帮助下,Spring Boot 将公共依赖项聚集在一起,最终提高了工作效率。
Spring Initializer:这基本上是一个 Web 应用程序,它可以自动创建一个内部项目结构,不必再手动设置。
自动配置:Spring Boot 的自动配置特性可以为正在处理的项目加载默认配置。这正方式可以避免不必要的 WAR 文件。
Spring 驱动器:这一功能为运行 Spring Boot 应用程序提供帮助。
日志和安全性:Spring Boot 的日志和安全性特性,确保所有使用 Spring Boot 的应用程序都得到了适当的保护,没有任何麻烦。
3、使用 profiles 配置特定环境的方式
profiles 是识别环境的关键
如应用程序属性文件中存在属性:example.message: Dynamic Message
想要用自定义应用程序属性
需要创建
application-dev,属性为 example.message: dev
application-prod,属性为 example.message: prod
如要应用其中一个自定义应用程序属性,
必须在环境中设置概要文件:
spring.profiles.active = prod
4、使用Maven创建Spring Boot应用程序的流程
使用Spring Initializr:
选择 Maven 项目和所需的依赖项。然后填写其他需要的细节,如组、工件,然后单击 Generate Project。
下载项目后,将项目解压缩到您的系统中。
接下来,使用 Spring 工具套件 IDE 上的 import 选项导入这个项目。
在导入项目时,必须选择项目类型为 Maven,源项目应该包含 pom.xml 文件。
5、Spring AOP 的关键概念和使用场景
关键概念:
- 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。
- 连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
- 通知(Advice): 在特定的连接点,AOP框架执行的动作。
- 切入点(Pointcut): 指定一个通知将被引发的一系列连接点的集合。
- 引入(Introduction): 添加方法或字段到被通知的类。
- 目标对象(Target Object): 包含连接点的对象。也被称作被通知或被代理对象。POJO
- AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。
- 织入(Weaving): 组装方面来创建一个被通知对象。
使用场景: - Authentication 权限
- Caching 缓存
- Context passing 内容传递
- Error handling 错误处理
- Lazy loading 懒加载
- Debugging 调试
- logging, tracing, profiling and monitoring 记录跟踪 优化 校准
- Performance optimization 性能优化
- Persistence 持久化
- Resource pooling 资源池
- Synchronization 同步
- Transactions 事务
6、Spring常用注解及说明
@Component:可以使用此注解描述Spring中的Bean,但它是一个泛化的概念,仅仅表示一个组件(Bean) ,并且可以作用在任何层次。
@Repository:用于将数据访问层(DAO层)的类标识为Spring中的Bean,其功能与@Component 相同。
@Service:通常作用在业务层(Service层),用于将业务层的类标识为Spring中的Bean,其功能与@Component 相同。
@Controller:通常作用在控制层(如Spring MVC的Controller),用于将控制层的类标识为Spring中的Bean,其功能与@Component 相同。
@Autowired:用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作。默认按照Bean的类型进行装配。
7、Spring MVC的工作流程
(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。
8、Spring Boot如何解决跨域问题
通过实现WebMvcConfigurer接口,然后重写addCorsMappings方法解决跨域问题。
9、在Spring Boot中使用Spring Data JPA如何实现持久层服务
(1)引入spring-data-jpa的包依赖
(2)在application.properties中加上在控制台打印sql语句的配置,方便调试
(3)修改实体类,添加注解@Entity、@Table(name="items")、@Id()、@GeneratedValue(strategy = GenerationType.AUTO)
(4)编写dao接口,继承了Repository<T, Serializable>
(5)编写service层和controller层
10、MyBatis是如何解决JDBC编程的不足
1、SQL语句写在代码中造成代码不易维护,实际应用SQL变化的可能较大,SQL变动需要改变java代码。
解决:将SQL语句配置在XXXXmapper.xml文件中与java代码分离。
2、向SQL语句传参数麻烦,因为SQL语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决: MyBatis自动将java对象映射至SQL语句。
3、对结果集解析麻烦,SQL变化导致解析代码变化,且解析前需要遍历
解决:MyBatis自动将SQL执行结果映射至java对象。
11、Spring框架如何实现事务管理
(1)配置transactionManager:
本地事务:基于JDBC事务管理器配置
全局事务:大部分应用服务器容器提供JTA支持,配置好JNDI数据源和JtaTransactionManager即可。
(2)编程式:应用需要调用Spring提供的PlatformTransactionManager、TransactionDefinition 和 TransactionStatus 三个核心接口。
(3)声明式:声明式通过配置或注解方式将事务管理与业务逻辑代码独立,开发人员只需在配置文件中做相应的事务规则声明或注解,便可以将事务规则通过AOP横切应用到业务逻辑中。
12、将Spring引导Web应用部署为JAR和WAR文件的步骤
(1)在 pom.xml 文件中添加以下插件:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
(2)构建一个JAR文件,需要在pom.xml中设置
<packaging>jar</packaging>
如果想要构建一个WAR文件,那么需要在pom.xml文件中设置
<packaging>war</packaging>
13、Spring Security和Shiro各种的优缺点
Spring Security是一个重量级的安全管理框架,Shiro是一个轻量级的安全管理框架
Spring Security概念复制,配置繁琐,Shiro概念简单,配置简单
Spring Security功能强大,Shiro功能简单
14、Spring Boot自动配置的原理
Spring Boot项目启动类上有一个核心注解@SpringBootApplication,该注解是一个组合注解,包含@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个核心注解。
其中:
@SpringBootConfiguration注解表示Spring Boot配置类;
@EnableAutoConfiguration注解表示开启自动配置功能,该注解是Spring Boot框架最重要的注解,也是实现自动化配置的注解。@EnableAutoConfiguration注解内部的方法会从Spring Boot提供的自动配置依赖的META-INF/spring.factories文件中获取所有候选自动配置类,然后根据项目pom.xml文件中加入的依赖文件筛选并启动符合当前项目运行环境对应的自动配置类;
@ComponentScan注解是一个组件包扫描器,其主要作用是扫描指定包及其子包下所有注解类文件作为Spring容器的组件使用。
15、Spring Boot的自动配置,禁用自动配置的方法
Auto-configuration 用于自动配置应用程序所需的配置。
要禁用自动配置属性,必须排除 @EnableAutoConfiguration 属性,在不希望应用该属性的场景中。
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}
如果类不在类路径中,那么要排除自动配置,照以下方法:
@EnableAutoConfiguration(excludeName={Sample.class})
使用 Spring .autoconfigure.exclude 属性来排除自动配置类列表
16、Mybatis的mapper映射
一对多:
<mapper namespace="com.msdn.dao.TeacherMapper">
<select id="getTeacherById" resultMap="TeacherStudent">
select s.id sid,s.name sname,t.id tid,t.name tname from mybatis.student s,mybatis.teacher t
where s.tid = t.id and t.id =#{id}
</select>
<resultMap id="TeacherStudent" type="Teacher">
<id property="id" column="tid" />
<result property="name" column="tname" />
<collection property="students" ofType="Student" >
<result property="id" column="sid" />
<result property="name" column="sname" />
<result property="tid" column="tid" />
</collection>
</resultMap>
</mapper>
一对一:
<mapper namespace="gler.mybatis.onetoone.mapper.ClassesMapper">
<select id="selectClassById" parameterType="int" resultMap="classmap">
select * from tb_class c, tb_head_teacher t where c.c_ht_id = t.ht_id and c.c_id=#{id}
</select>
<!-- resultMap:映射实体类和字段之间的一一对应的关系 -->
<resultMap id="classmap" type="Classes">
<id property="id" column="c_id" />
<result property="name" column="c_name" />
<!-- 一对一关联映射:association -->
<association property="teacher" javaType="HeadTeacher">
<id property="id" column="ht_id" />
<result property="name" column="ht_name" />
<result property="age" column="ht_age" />
</association>
</resultMap>
</mapper>
16、SpringBoot常用注解
//实体类:
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
public interface HomeRepository extends JpaRepository<Home,Integer> {
@Query(value="select * from home where home_id = ?1", nativeQuery = true)
Home getByHomeId(Integer homeId);
}
public interface HomeService {
ResponseResult getById(int homeId);
}
@Service
public class HomeServiceImpl implements HomeService {
@Resource
private HomeRepository homeRepository;
@Override
public ResponseResult getById(int homeId) {
Home home = homeRepository.getByHomeId(homeId);
if (home == null){
ResponseResult.failure(ResultCode.DATA_NULL);
}
return ResponseResult.success(home);
}
}
@RestController
@RequestMapping(value = "/api/home/")
public class HomeController {
@Resource
private HomeService homeService;
@PostMapping(value = "homeId")
public ResponseResult getByHomeId(@PathVariable int homeId){
return homeService.getById(homeId);
}