Spring基础(spring基础思维导图)_3

  本篇文章为你整理了Spring基础(spring基础思维导图)的详细内容,包含有spring基础面试题 spring基础思维导图 spring基础包 spring基础教程 Spring基础,希望能帮助你了解 Spring基础。

   Java 全栈知识体系 ❁导航 ♥面试 ✿导读 JavaJavaJava 面向对象和基础 Java 面向对象基础 Java 基础知识体系 Java进阶 - 集合框架 Java 集合框架详解 Java进阶 - 并发框架 Java 并发知识体系 Java 并发理论基础 Java 并发线程基础 J.U.C 知识体系与详解 Java进阶 - IO框架 Java IO/NIO/AIO详解 Java进阶 - 新版本特性 Java 8 特性详解 Java 8 以上版本特性体系 Java 8 升Java 11特性必读 Java 11 升Java 17特性必读 Java进阶 - JVM相关 Java 类加载机制 Java 字节码和增强技术 JVM 内存结构详解 JVM 垃圾回收机制 Java 调试排错相关 算法算法算法基础和思想 数据结构基础 常见排序算法 算法思想 一些领域算法 安全算法 字符串匹配算法 分布式系统算法 海量数据处理 负载均衡算法 推荐算法 数据挖掘算法 ID生成算法 其它算法相关 头脑风暴 数据库数据库数据库基础和原理 数据库原理 SQL语言 SQL 数据库 MySQL 详解 NoSQL 数据库 Redis 详解 MongoDB 详解 ElasticSearch 详解 开发开发开发 - 常用开发基础 常用类库详解 正则表达式详解 CRON表达式详解 网络协议和工具详解 安全相关详解 开发 - 质量保障 单元测试详解 统一风格详解 质量管理详解 开发 - 代码重构 代码重构相关 SpringSpringSpring Framework(v5.3) Spring框架知识体系 Spring框架组成 控制反转(IOC) 面向切面编程(AOP) SpringMVC SpringBoot系列(v2.5) SpringBoot知识体系 SpringBoot入门 SpringBoot接口设计和实现 SpringBoot集成MySQL SpringBoot集成ShardingJDBC SpringBoot集成Redis SpringBoot集成Postgre SpringBoot集成ElasticSearch SpringBoot集成Socket SpringBoot定时任务 SpringBoot后端视图 SpringBoot监控 SpringBoot进阶 框架中间件框架中间件Web 容器 Tomcat 源码详解 ORM 框架 MyBatis 源码详解 分表分库框架 ShardingSphere 详解 架构架构架构基础和技术点 架构知识体系 从角色视角看架构 从分层视角看架构 从演化视角看架构 从模式视角看架构 高并发之缓存 高并发之限流 高并发之降级和熔断 高可用之负载均衡 高可用之容灾备份 分布式系统 分布式理论和一致性算法 全局唯一ID实现方案 分布式锁及实现方案 分布式事务及实现方案 分布式任务及实现方案 分布式会话及实现方案 微服务系统 微服务系统和设计 系统设计之商业业务平台 秒杀抽奖相关设计 电商交易相关设计 仓储物流相关设计 拉新投放相关设计 其它综合相关设计 系统设计之数据仓库平台 数据库架构相关设计 数据同步相关设计 数据仓库相关设计 数据治理相关设计 工具部署工具部署 开发工具 Git详解 Linux Docker 项目 方法论方法论开发理论 开发原则(SOLID) 分布式理论(CAP) 分布式理论(BASE) 事务理论(ACID) 微服务理论(康威定律) 开源协议 常见开源协议详解 知识共享许可协议 国产开源木兰协议 代码规范 阿里巴巴 Java开发手册 Google Java 编程风格指南 Twitter Java代码规范 开发流程 软件生命周期与传统模型 结合测试演化的过程模型 敏捷开发项目管理理论 敏捷之极限编程(XP) 敏捷之Scrum Kanban 敏捷实践之测试驱动开发 设计模式 设计模式详解 系统认证 CMMI 认证 等级保护认证 ISO27001认证 产品团队产品团队技术之外 技术之外应该思考什么 个人相关 个人成长和认知 产品相关 产品设计和思考 团队相关 管对管理和成长 其它相关 其它软实力等 关于 ❁导航 ♥面试 ✿导读 JavaJavaJava 面向对象和基础 Java 面向对象基础 Java 基础知识体系 Java进阶 - 集合框架 Java 集合框架详解 Java进阶 - 并发框架 Java 并发知识体系 Java 并发理论基础 Java 并发线程基础 J.U.C 知识体系与详解 Java进阶 - IO框架 Java IO/NIO/AIO详解 Java进阶 - 新版本特性 Java 8 特性详解 Java 8 以上版本特性体系 Java 8 升Java 11特性必读 Java 11 升Java 17特性必读 Java进阶 - JVM相关 Java 类加载机制 Java 字节码和增强技术 JVM 内存结构详解 JVM 垃圾回收机制 Java 调试排错相关 算法算法算法基础和思想 数据结构基础 常见排序算法 算法思想 一些领域算法 安全算法 字符串匹配算法 分布式系统算法 海量数据处理 负载均衡算法 推荐算法 数据挖掘算法 ID生成算法 其它算法相关 头脑风暴 数据库数据库数据库基础和原理 数据库原理 SQL语言 SQL 数据库 MySQL 详解 NoSQL 数据库 Redis 详解 MongoDB 详解 ElasticSearch 详解 开发开发开发 - 常用开发基础 常用类库详解 正则表达式详解 CRON表达式详解 网络协议和工具详解 安全相关详解 开发 - 质量保障 单元测试详解 统一风格详解 质量管理详解 开发 - 代码重构 代码重构相关 SpringSpringSpring Framework(v5.3) Spring框架知识体系 Spring框架组成 控制反转(IOC) 面向切面编程(AOP) SpringMVC SpringBoot系列(v2.5) SpringBoot知识体系 SpringBoot入门 SpringBoot接口设计和实现 SpringBoot集成MySQL SpringBoot集成ShardingJDBC SpringBoot集成Redis SpringBoot集成Postgre SpringBoot集成ElasticSearch SpringBoot集成Socket SpringBoot定时任务 SpringBoot后端视图 SpringBoot监控 SpringBoot进阶 框架中间件框架中间件Web 容器 Tomcat 源码详解 ORM 框架 MyBatis 源码详解 分表分库框架 ShardingSphere 详解 架构架构架构基础和技术点 架构知识体系 从角色视角看架构 从分层视角看架构 从演化视角看架构 从模式视角看架构 高并发之缓存 高并发之限流 高并发之降级和熔断 高可用之负载均衡 高可用之容灾备份 分布式系统 分布式理论和一致性算法 全局唯一ID实现方案 分布式锁及实现方案 分布式事务及实现方案 分布式任务及实现方案 分布式会话及实现方案 微服务系统 微服务系统和设计 系统设计之商业业务平台 秒杀抽奖相关设计 电商交易相关设计 仓储物流相关设计 拉新投放相关设计 其它综合相关设计 系统设计之数据仓库平台 数据库架构相关设计 数据同步相关设计 数据仓库相关设计 数据治理相关设计 工具部署工具部署 开发工具 Git详解 Linux Docker 项目 方法论方法论开发理论 开发原则(SOLID) 分布式理论(CAP) 分布式理论(BASE) 事务理论(ACID) 微服务理论(康威定律) 开源协议 常见开源协议详解 知识共享许可协议 国产开源木兰协议 代码规范 阿里巴巴 Java开发手册 Google Java 编程风格指南 Twitter Java代码规范 开发流程 软件生命周期与传统模型 结合测试演化的过程模型 敏捷开发项目管理理论 敏捷之极限编程(XP) 敏捷之Scrum Kanban 敏捷实践之测试驱动开发 设计模式 设计模式详解 系统认证 CMMI 认证 等级保护认证 ISO27001认证 产品团队产品团队技术之外 技术之外应该思考什么 个人相关 个人成长和认知 产品相关 产品设计和思考 团队相关 管对管理和成长 其它相关 其它软实力等 关于 Spring Framework 5基础

   ♥Spring框架知识体系详解♥ Spring基础 - Spring和Spring框架组成 Spring基础 - Spring简单例子引入Spring要点 Spring基础 - Spring核心之控制反转(IOC) Spring基础 - Spring核心之面向切面编程(AOP) Spring基础 - SpringMVC请求流程和案例 Spring进阶- Spring IOC实现原理详解之IOC体系结构设计 Spring进阶- Spring IOC实现原理详解之IOC初始化流程 Spring进阶- Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等) Spring进阶 - Spring AOP实现原理详解之AOP切面的实现 Spring进阶 - Spring AOP实现原理详解之AOP代理的创建 Spring进阶 - Spring AOP实现原理详解之Cglib代理实现 Spring进阶 - Spring AOP实现原理详解之JDK代理实现 Spring进阶 - SpringMVC实现原理之DispatcherServlet的初始化过程 Spring进阶 - SpringMVC实现原理之DispatcherServlet处理请求的过程 SpringBoot 2.5.x系列

   ♥SpringBoot 知识体系详解♥ ▶SpringBoot入门 - SpringBoot简介 SpringBoot入门 - SpringBoot HelloWorld SpringBoot入门 - 对Hello world进行MVC分层 SpringBoot入门 - 添加内存数据库H2 SpringBoot入门 - 定制自己的Banner SpringBoot入门 - 添加Logback日志 SpringBoot入门 - 配置热部署devtools工具 SpringBoot入门 - 开发中还有哪些常用注解 ▶SpringBoot接口 - 如何统一接口封装 SpringBoot接口 - 如何对参数进行校验 SpringBoot接口 - 如何参数校验国际化 SpringBoot接口 - 如何统一异常处理 SpringBoot接口 - 如何提供多个版本接口 SpringBoot接口 - 如何生成接口文档之Swagger技术栈 SpringBoot接口 - 如何生成接口文档之集成Smart-Doc SpringBoot接口 - 如何访问外部接口 SpringBoot接口 - 如何保证接口幂等 SpringBoot接口 - 如何对接口进行签名 SpringBoot接口 - 如何实现接口限流之单实例 SpringBoot接口 - 如何实现接口限流之分布式 ▶SpringBoot集成MySQL - 基于JPA的封装 SpringBoot集成MySQL - MyBatis XML方式 SpringBoot集成MySQL - MyBatis 注解方式 SpringBoot集成MySQL - MyBatis PageHelper分页 SpringBoot集成MySQL - MyBatis 多个数据源 SpringBoot集成MySQL - MyBatis-Plus方式 SpringBoot集成MySQL - MyBatis-Plus代码自动生成 SpringBoot集成MySQL - MyBatis-Plus基于字段隔离的多租户 ▶SpringBoot集成ShardingJDBC - Sharding-JDBC简介和基于MyBatis的单库分表 SpringBoot集成ShardingJDBC - 基于JPA的单库分表 SpringBoot集成ShardingJDBC - 基于JPA的读写分离 SpringBoot集成ShardingJDBC - 基于JPA的DB隔离多租户方案 ▶SpringBoot集成连接池 - 数据库连接池和默认连接池HikariCP SpringBoot集成连接池 - 集成数据库Druid连接池 ▶SpringBoot数据库管理 - 用Liquibase对数据库管理和迁移 SpringBoot数据库管理 - 用flyway对数据库管理和迁移 ▶SpringBoot集成PostgreSQL - 基于JPA封装基础数据操作 SpringBoot集成PostgreSQL - 基于MyBatis-Plus方式 SpringBoot集成PostgreSQL - NoSQL特性JSONB的封装 ▶SpringBoot集成Redis - 基于RedisTemplate+Jedis的数据操作 SpringBoot集成Redis - 基于RedisTemplate+Lettuce数据操作 SpringBoot集成Redis - 基于RedisTemplate+Lettuce数据类封装 SpringBoot集成Redis - Redis分布式锁的实现之Jedis(setNXPX+Lua) ▶SpringBoot集成MongoDB - 基于MongoTemplate的数据操作 ▶SpringBoot集成ElasticSearch - 基于ElasticSearchTemplate的数据操作 ▶SpringBoot集成Socket - 基础的Websocket实现 SpringBoot集成Socket - 用Netty实现socket ▶SpringBoot定时任务 - Timer实现方式 SpringBoot定时任务 - ScheduleExecutorService实现方式 SpringBoot定时任务 - Netty HashedWheelTimer方式 SpringBoot定时任务 - Spring Schedule实现方式 SpringBoot定时任务 - 基础quartz实现方式 SpringBoot定时任务 - 分布式quartz cluster方式 SpringBoot定时任务 - 分布式elastic-job方式 SpringBoot定时任务 - 分布式xxl-job方式 ▶SpringBoot集成文件 - 基础的文件上传和下载 SpringBoot集成文件 - 大文件的上传(异步,分片,断点续传和秒传) SpringBoot集成文件 - 集成POI之Excel导入导出 SpringBoot集成文件 - 集成EasyExcel之Excel导入导出 SpringBoot集成文件 - 集成EasyPOI之Excel导入导出 SpringBoot集成文件 - 集成POI之Word导出 SpringBoot集成文件 - 集成POI-tl之基于模板的Word导出 SpringBoot集成文件 - 集成itextpdf之导出PDF ▶SpringBoot后端视图 - 基于Thymeleaf视图解析 ▶SpringBoot集成JavaFX2 - JavaFX 2.0应用 ▶SpringBoot应用部署 - 打包成jar部署 SpringBoot应用部署 - 使用第三方JAR包 SpringBoot应用部署 - 打包成war部署 SpringBoot应用部署 - 替换tomcat为Jetty容器 SpringBoot应用部署 - 替换tomcat为Undertow容器 SpringBoot应用部署 - 在linux环境将jar制作成service SpringBoot应用部署 - docker镜像打包,运行和管理 SpringBoot应用部署 - 使用Docker Compose对容器编排管理 ▶SpringBoot监控 - 集成actuator监控工具 SpringBoot监控 - 集成springboot admin监控工具 ▶SpringBoot进阶 - 实现自动装配原理 SpringBoot进阶 - 自定义starter SpringBoot进阶 - 嵌入web容器Tomcat原理 SpringBoot进阶 - 健康检查Actuator原理 # Spring基础 - Spring简单例子引入Spring要点上文中我们简单介绍了Spring和Spring Framework的组件,那么这些Spring Framework组件是如何配合工作的呢?本文主要承接上文,向你展示Spring Framework组件的典型应用场景和基于这个场景设计出的简单案例,并以此引出Spring的核心要点,比如IOC和AOP等;在此基础上还引入了不同的配置方式, 如XML,Java配置和注解方式的差异。@pdai

  Spring基础 - Spring简单例子引入Spring要点Spring框架如何应用设计一个Spring的Hello World这个例子体现了Spring的哪些核心要点控制反转 - IOC面向切面 - AOPSpring框架设计如何逐步简化开发的Java 配置方式改造注解配置方式改造SpringBoot托管配置结合Spring历史版本和SpringBoot看发展# Spring框架如何应用上文中,我们展示了Spring和Spring Framework的组件, 这里对于开发者来说有几个问题:

  首先,对于Spring进阶,直接去看IOC和AOP,存在一个断层,所以需要整体上构建对Spring框架认知上进一步深入,这样才能构建知识体系。其次,很多开发者入门都是从Spring Boot开始的,他对Spring整体框架底层,以及发展历史不是很了解; 特别是对于一些老旧项目维护和底层bug分析没有全局观。再者,Spring代表的是一种框架设计理念,需要全局上理解Spring Framework组件是如何配合工作的,需要理解它设计的初衷和未来趋势。如下是官方在解释Spring框架的常用场景的图

  我加上一些注释后,是比较好理解的;引入这个图,重要的原因是为后面设计一个案例帮助你构建认知。

  # 设计一个Spring的Hello World结合上面的使用场景,设计一个查询用户的案例的两个需求,来看Spring框架帮我们简化了什么开发工作:

  查询用户数据 - 来看DAO+POJO- Service 的初始化和装载。给所有Service的查询方法记录日志创建一个Maven的Java项目

  引入Spring框架的POM依赖,以及查看这些依赖之间的关系

 ?xml version= 1.0 encoding= UTF-8 ? 

 

   project xmlns= http://maven.apache.org/POM/4.0.0

   xmlns:xsi= http://www.w3.org/2001/XMLSchema-instance

   xsi:schemaLocation= http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd

   modelVersion 4.0.0 /modelVersion

   groupId tech.pdai /groupId

   artifactId 001-spring-framework-demo-helloworld-xml /artifactId

   version 1.0-SNAPSHOT /version

   properties

   maven.compiler.source 8 /maven.compiler.source

   maven.compiler.target 8 /maven.compiler.target

   spring.version 5.3.9 /spring.version

   aspectjweaver.version 1.9.6 /aspectjweaver.version

   /properties

   dependencies

   dependency

   groupId org.springframework /groupId

   artifactId spring-context /artifactId

   version ${spring.version} /version

   /dependency

   dependency

   groupId org.springframework /groupId

   artifactId spring-core /artifactId

   version ${spring.version} /version

   /dependency

   dependency

   groupId org.springframework /groupId

   artifactId spring-beans /artifactId

   version ${spring.version} /version

   /dependency

   dependency

   groupId org.aspectj /groupId

   artifactId aspectjweaver /artifactId

   version ${aspectjweaver.version} /version

   /dependency

   /dependencies

   /project

  

 

  POJO - User

package tech.pdai.springframework.entity;

 

   * @author pdai

  public class User {

   * user s name.

   private String name;

   * user s age.

   private int age;

   * init.

   * @param name name

   * @param age age

   public User(String name, int age) {

   this.name = name;

   this.age = age;

   public String getName() {

   return name;

   public void setName(String name) {

   this.name = name;

   public int getAge() {

   return age;

   public void setAge(int age) {

   this.age = age;

  

DAO 获取 POJO, UserDaoServiceImpl (mock 数据)
package tech.pdai.springframework.dao;

 

  import java.util.Collections;

  import java.util.List;

  import tech.pdai.springframework.entity.User;

   * @author pdai

  public class UserDaoImpl {

   * init.

   public UserDaoImpl() {

   * mocked to find user list.

   * @return user list

   public List User findUserList() {

   return Collections.singletonList(new User( pdai , 18));

  

并增加daos.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

   bean id= userDao >业务层 UserServiceImpl(调用DAO层)

package tech.pdai.springframework.service;

 

  import java.util.List;

  import tech.pdai.springframework.dao.UserDaoImpl;

  import tech.pdai.springframework.entity.User;

   * @author pdai

  public class UserServiceImpl {

   * user dao impl.

   private UserDaoImpl userDao;

   * init.

   public UserServiceImpl() {

   * find user list.

   * @return user list

   public List User findUserList() {

   return this.userDao.findUserList();

   * set dao.

   * @param userDao user dao

   public void setUserDao(UserDaoImpl userDao) {

   this.userDao = userDao;

  

并增加services.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

   !-- services --

   bean id= userService >拦截所有service中的方法,并输出记录

package tech.pdai.springframework.aspect;

 

  import java.lang.reflect.Method;

  import org.aspectj.lang.ProceedingJoinPoint;

  import org.aspectj.lang.annotation.Around;

  import org.aspectj.lang.annotation.Aspect;

  import org.aspectj.lang.reflect.MethodSignature;

  import org.springframework.context.annotation.EnableAspectJAutoProxy;

   * @author pdai

  @Aspect

  public class LogAspect {

   * aspect for every methods under service package.

   @Around( execution(* tech.pdai.springframework.service.*.*(..)) )

   public Object businessService(ProceedingJoinPoint pjp) throws Throwable {

   // get attribute through annotation

   Method method = ((MethodSignature) pjp.getSignature()).getMethod();

   System.out.println( execute method: + method.getName());

   // continue to process

   return pjp.proceed();

  

并增加aspects.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

   xmlns:aop= http://www.springframework.org/schema/aop

   xmlns:context= http://www.springframework.org/schema/context

   xsi:schemaLocation= http://www.springframework.org/schema/beans

   http://www.springframework.org/schema/beans/spring-beans.xsd

   http://www.springframework.org/schema/aop

   http://www.springframework.org/schema/aop/spring-aop.xsd

   http://www.springframework.org/schema/context

   http://www.springframework.org/schema/context/spring-context.xsd

  
import org.springframework.context.ApplicationContext;

  import org.springframework.context.support.ClassPathXmlApplicationContext;

  import tech.pdai.springframework.entity.User;

  import tech.pdai.springframework.service.UserServiceImpl;

   * @author pdai

  public class App {

   * main interfaces.

   * @param args args

   public static void main(String[] args) {

   // create and configure beans

   ApplicationContext context =

   new ClassPathXmlApplicationContext( aspects.xml , daos.xml , services.xml );

   // retrieve configured instance

   UserServiceImpl service = context.getBean( userService , UserServiceImpl.class);

   // use configured instance

   List User userList = service.findUserList();

   // print info from beans

   userList.forEach(a - System.out.println(a.getName() + , + a.getAge()));

  

整体结构和运行app

 

  # 这个例子体现了Spring的哪些核心要点那么Spring框架帮助我们做什么,它体现了什么哪些要点呢?

  # 控制反转 - IOC来看第一个需求:查询用户(service通过调用dao查询pojo),本质上如何创建User/Dao/Service等;

  如果没有Spring框架,我们需要自己创建User/Dao/Service等,比如:

UserDaoImpl userDao = new UserDaoImpl();

 

  UserSericeImpl userService = new UserServiceImpl();

  userService.setUserDao(userDao);

  List User userList = userService.findUserList();

  

有了Spring框架,可以将原有Bean的创建工作转给框架, 需要用时从Bean的容器中获取即可,这样便简化了开发工作Bean的创建和使用分离了。

 

  

// create and configure beans

 

  ApplicationContext context =

   new ClassPathXmlApplicationContext( aspects.xml , daos.xml , services.xml );

  // retrieve configured instance

  UserServiceImpl service = context.getBean( userService , UserServiceImpl.class);

  // use configured instance

  List User userList = service.findUserList();

  

 

  更进一步,你便能理解为何会有如下的知识点了:

  Spring框架管理这些Bean的创建工作,即由用户管理Bean转变为框架管理Bean,这个就叫控制反转 - Inversion of Control (IoC)Spring 框架托管创建的Bean放在哪里呢? 这便是IoC Container;Spring 框架为了更好让用户配置Bean,必然会引入不同方式来配置Bean? 这便是xml配置,Java配置,注解配置等支持Spring 框架既然接管了Bean的生成,必然需要管理整个Bean的生命周期等;应用程序代码从Ioc Container中获取依赖的Bean,注入到应用程序中,这个过程叫 依赖注入(Dependency Injection,DI) ; 所以说控制反转是通过依赖注入实现的,其实它们是同一个概念的不同角度描述。通俗来说就是IoC是设计思想,DI是实现方式在依赖注入时,有哪些方式呢?这就是构造器方式,@Autowired, @Resource, @Qualifier... 同时Bean之间存在依赖(可能存在先后顺序问题,以及循环依赖问题等)这边引入我们后续的相关文章:Spring基础 - Spring之控制反转(IOC)

  # 面向切面 - AOP来看第二个需求:给Service所有方法调用添加日志(调用方法时),本质上是解耦问题;

  如果没有Spring框架,我们需要在每个service的方法中都添加记录日志的方法,比如:

/**

 

  * find user list.

  * @return user list

  public List User findUserList() {

   System.out.println( execute method findUserList );

   return this.userDao.findUserList();

  

有了Spring框架,通过@Aspect注解 定义了切面,这个切面中定义了拦截所有service中的方法,并记录日志; 可以明显看到,框架将日志记录和业务需求的代码解耦了,不再是侵入式的了
/**

 

  * aspect for every methods under service package.

  @Around( execution(* tech.pdai.springframework.service.*.*(..)) )

  public Object businessService(ProceedingJoinPoint pjp) throws Throwable {

   // get attribute through annotation

   Method method = ((MethodSignature) pjp.getSignature()).getMethod();

   System.out.println( execute method: + method.getName());

   // continue to process

   return pjp.proceed();

  

更进一步,你便能理解为何会有如下的知识点了:

 

  Spring 框架通过定义切面, 通过拦截切点实现了不同业务模块的解耦,这个就叫面向切面编程 - Aspect Oriented Programming (AOP)为什么@Aspect注解使用的是aspectj的jar包呢?这就引出了Aspect4J和Spring AOP的历史渊源,只有理解了Aspect4J和Spring的渊源才能理解有些注解上的兼容设计如何支持更多拦截方式来实现解耦, 以满足更多场景需求呢? 这就是@Around, @Pointcut... 等的设计那么Spring框架又是如何实现AOP的呢? 这就引入代理技术,分静态代理和动态代理,动态代理又包含JDK代理和CGLIB代理等这边引入我们后续的相关文章:Spring基础 - Spring之面向切面编程(AOP)

  # Spring框架设计如何逐步简化开发的通过上述的框架介绍和例子,已经初步知道了Spring设计的两个大的要点:IOC和AOP;从框架的设计角度而言,更为重要的是简化开发,比如提供更为便捷的配置Bean的方式,直至0配置(即约定大于配置)。这里我将通过Spring历史版本的发展,和SpringBoot的推出等,来帮你理解Spring框架是如何逐步简化开发的。

  # Java 配置方式改造在前文的例子中, 通过xml配置方式实现的,这种方式实际上比较麻烦; 我通过Java配置进行改造:

  User,UserDaoImpl, UserServiceImpl,LogAspect不用改将原通过.xml配置转换为Java配置

package tech.pdai.springframework.config;

 

  import org.springframework.context.annotation.Bean;

  import org.springframework.context.annotation.Configuration;

  import org.springframework.context.annotation.EnableAspectJAutoProxy;

  import tech.pdai.springframework.aspect.LogAspect;

  import tech.pdai.springframework.dao.UserDaoImpl;

  import tech.pdai.springframework.service.UserServiceImpl;

   * @author pdai

  @EnableAspectJAutoProxy

  @Configuration

  public class BeansConfig {

   * @return user dao

   @Bean( userDao )

   public UserDaoImpl userDao() {

   return new UserDaoImpl();

   * @return user service

   @Bean( userService )

   public UserServiceImpl userService() {

   UserServiceImpl userService = new UserServiceImpl();

   userService.setUserDao(userDao());

   return userService;

   * @return log aspect

   @Bean( logAspect )

   public LogAspect logAspect() {

   return new LogAspect();

  

在App中加载BeansConfig的配置
package tech.pdai.springframework;

 

  import java.util.List;

  import org.springframework.context.annotation.AnnotationConfigApplicationContext;

  import tech.pdai.springframework.config.BeansConfig;

  import tech.pdai.springframework.entity.User;

  import tech.pdai.springframework.service.UserServiceImpl;

   * @author pdai

  public class App {

   * main interfaces.

   * @param args args

   public static void main(String[] args) {

   // create and configure beans

   AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeansConfig.class);

   // retrieve configured instance

   UserServiceImpl service = context.getBean( userService , UserServiceImpl.class);

   // use configured instance

   List User userList = service.findUserList();

   // print info from beans

   userList.forEach(a - System.out.println(a.getName() + , + a.getAge()));

  

整体结构和运行app

 

  # 注解配置方式改造更进一步,Java 5开始提供注解支持,Spring 2.5 开始完全支持基于注解的配置并且也支持JSR250 注解。在Spring后续的版本发展倾向于通过注解和Java配置结合使用.

  BeanConfig 不再需要Java配置

package tech.pdai.springframework.config;

 

  import org.springframework.context.annotation.ComponentScan;

  import org.springframework.context.annotation.ComponentScans;

  import org.springframework.context.annotation.Configuration;

  import org.springframework.context.annotation.EnableAspectJAutoProxy;

   * @author pdai

  @Configuration

  @EnableAspectJAutoProxy

  public class BeansConfig {

  

UserDaoImpl 增加了 @Repository注解
/**

 

   * @author pdai

  @Repository

  public class UserDaoImpl {

   * mocked to find user list.

   * @return user list

   public List User findUserList() {

   return Collections.singletonList(new User( pdai , 18));

  

UserServiceImpl 增加了@Service 注解,并通过@Autowired注入userDao.
/**

 

   * @author pdai

  @Service

  public class UserServiceImpl {

   * user dao impl.

   @Autowired

   private UserDaoImpl userDao;

   * find user list.

   * @return user list

   public List User findUserList() {

   return userDao.findUserList();

  

在App中扫描tech.pdai.springframework包
package tech.pdai.springframework;

 

  import java.util.List;

  import org.springframework.context.annotation.AnnotationConfigApplicationContext;

  import tech.pdai.springframework.entity.User;

  import tech.pdai.springframework.service.UserServiceImpl;

   * @author pdai

  public class App {

   * main interfaces.

   * @param args args

   public static void main(String[] args) {

   // create and configure beans

   AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(

   tech.pdai.springframework );

   // retrieve configured instance

   UserServiceImpl service = context.getBean(UserServiceImpl.class);

   // use configured instance

   List User userList = service.findUserList();

   // print info from beans

   userList.forEach(a - System.out.println(a.getName() + , + a.getAge()));

  

整体结构和运行app

 

  # SpringBoot托管配置Springboot实际上通过约定大于配置的方式,使用xx-starter统一的对Bean进行默认初始化,用户只需要很少的配置就可以进行开发了。

  这个因为很多开发者都是从SpringBoot开始着手开发的,所以这个比较好理解。我们需要的是将知识点都串联起来,构筑认知体系。

  # 结合Spring历史版本和SpringBoot看发展最后结合Spring历史版本总结下它的发展:

  (这样是不是能够帮助你在整体上构建了知识体系的认知了呢?)

  PS:相关代码,可以通过这里在新窗口打开直接查看

   我要纠错 Spring基础 - Spring和Spring框架组成 Spring基础 - Spring核心之控制反转(IOC)

  苏ICP备19053722号 pdai copyright © 2017-present Spring基础 - Spring简单例子引入Spring要点 Spring框架如何应用 设计一个Spring的Hello World 这个例子体现了Spring的哪些核心要点 控制反转 - IOC 面向切面 - AOP Spring框架设计如何逐步简化开发的 Java 配置方式改造 注解配置方式改造 SpringBoot托管配置 结合Spring历史版本和SpringBoot看发展 【双11】腾讯云服务器Java全栈读者专享
2核2G,4M,40GB, 50元/1年 查看2核4G,6M,60GB, 100元/1年 查看4核8G,10M,100GB, 300元/1年 查看目录Spring基础 - Spring简单例子引入Spring要点 Spring框架如何应用 设计一个Spring的Hello World 这个例子体现了Spring的哪些核心要点 控制反转 - IOC 面向切面 - AOP Spring框架设计如何逐步简化开发的 Java 配置方式改造 注解配置方式改造 SpringBoot托管配置 结合Spring历史版本和SpringBoot看发展 手机看微信扫一扫
可以手机看或分享至朋友圈
全屏看左栏交流圈添加pdai微信进《Java全栈知识体系》学习交流圈「无任何套路」 PS:添加时请备注Java全栈,谢谢! 下资料扫描公众号,回复“资料”下载10GB+书籍资料「无任何套路」公众号: Java全栈知识体系
支持我鼓励/支持/赞赏我
1. 不靠它生存但仍希望得到你的鼓励;
2. 时刻警醒自己保持技术人的初心,恒心,简单,利他;
(点击右侧❤️可以查看赞赏榜单和用途)
面试
上一篇
下一篇站点图 关于我 关于站点 最近更新记录问题反馈常用搜索百度 Google Bing Github 搜代码 技术社区CSDN OSChina 知否 掘金 Linux公社 IBM 开发者 StackOverflow Java相关面向对象基础语法基础集合框架并发基础并发关键字JUC并发框架IO框架Java8 特性JVM基础调试排错更多资源算法相关数组与线性表树详解图详解内部排序算法思想安全算法大数据处理分布式算法负载均衡算法推荐算法头脑风暴数据库相关数据库原理SQL语言MySQL相关MongoDBElasticSearch开发基础相关常用类库单元测试正则表达式网络协议安全相关常见重构技巧架构相关架构基础架构视角架构演进架构模式和要素高并发之缓存高并发之限流高并发之降级负载均衡容灾备份架构安全秒杀系统设计架构案例工具和部署工具集合IDE相关GitMavenLinuxDocker方法论SOLIDCAPBASE开源协议代码规范设计模式产品和团队产品相关团队相关其它分享

  以上就是Spring基础(spring基础思维导图)的详细内容,想要了解更多 Spring基础的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: