目录
ssm原理图
1. 首先浏览器上访问路径 /listCategory
2. tomcat根据web.xml上的配置信息,拦截到了/listCategory,并将其交由DispatcherServlet处理。
3. DispatcherServlet 根据springMVC的配置,将这次请求交由CategoryController类进行处理,所以需要进行这个类的实例化
4. 在实例化CategoryController的时候,注入CategoryServiceImpl。 (自动装配实现了CategoryService接口的的实例,只有CategoryServiceImpl实现了CategoryService接口,所以就会注入CategoryServiceImpl)
5. 在实例化CategoryServiceImpl的时候,又注入CategoryMapper
6. 根据ApplicationContext.xml中的配置信息,将CategoryMapper和Category.xml关联起来了。
7. 这样拿到了实例化好了的CategoryController,并调用 list 方法
8. 在list方法中,访问CategoryService,并获取数据,并把数据放在"cs"上,接着服务端跳转到listCategory.jsp去
9. 最后在listCategory.jsp 中显示数据)
SSM框架原理【超级详细】_ssm工作原理_小智解说的博客-CSDN博客
springMvc的执行流程
Spring 框架中都用到了哪些设计模式?
(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式:Bean默认为单例模式。
(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新
Spring IOC容器对bean的生命周期
通过构造器或工厂方法创建bean实例
为bean的属性设置值和对其他bean的引用
调用bean的初始化方法
bean可以正常使用
当容器关闭时,调用bean的销毁方法
Spring中Bean的作用域
1)singleton:单例模式,使用 singleton 定义的 Bean 在 Spring 容器中只有一个实例,这也是 Bean 默认的作用域。
2)prototype:原型模式,可创建多个Bean实例,每次返回的都是一个新的实例。
3)request: 每次HTTP请求会创建一个新的Bean,仅在当前 HTTP Request内有效。
4)session: 同一个Session共享一个Bean实例。不同Session使用不同的实例,该作用域仅在当前 HTTP Session 内有效。
5)global Session:在一个全局HTTP Session 中,所有Session共享一个Bean实例。
singleton 和 prototype 是最常用的两种
Spring中Bean的作用域_智慧浩海的博客-CSDN博客
Spring对外提供的自动装配
byName, byType, constructor, autodetect , no
https://code84.com/920329.html
Spring AOP 的实现过程
Spring AOP的底层有2种实现:JDK动态代理、CGLIB
前者的原理是JDK反射,并且只支持Java接口的代理;
后者的原理是继承(extend)与覆写(override),因此能支持普通的Java类的代理。两种方式都是动态代理,即运行时实时生成代理
区别于前两者,AspectJ是一种静态代理的实现,即在编译时或者载入类时直接修改被代理类文件的字节码,而非运行时实时生成代理。因此这种方式需要额外的编译器或者JVM Agent支持,通过一些配置Spring和AspectJ也可以配合使用。
JDK动态代理实现原理:通过实现InvocationHandlet接口创建自己的调用处理器;
通过为Proxy(代理角色)类指定ClassLoader对象和一组interface来创建动态代理;
通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型;
通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入;
JDK动态代理是面向接口的代理模式,如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生产被代理接口的新的匿名实现类,重写了其中AOP的增强方法
CGLib动态代理:是一个强大、高性能的Code生产类库,可以实现运行期动态扩展java类,Spring在运行期间通过 CGlib继承要被动态代理的类,重写父类的方法,实现AOP面向切面编程呢。
两者对比:JDK动态代理是面向接口的。
CGLib动态代理是通过字节码底层继承要代理类来实现(如果被代理类被final关键字所修饰,会失败)。
如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制);
如果要被代理的对象不是个实现类那么,Spring会强制使用CGLib来实现动态代理
Spring事务与JDK/CGLIB动态代理_成功人士从不写博客的博客-CSDN博客
自定义aop
https://www.cnblogs.com/dubhlinn/p/10708454.html
springboot如何解决循环依赖
Spring靠提前暴露创建中的单例实例,来解决单例模式下的循环依赖
构造函数注入: 在构造函数中注入依赖项,而不是在属性中注入。
Setter注入: 使用setter方法注入依赖项,而不是在构造函数中注入。
延迟注入: 使用@Lazy注解延迟加载依赖项。
@Autowired注解的required属性: 将required属性设置为false,以避免出现循环依赖问题。
@DependsOn注解: 使用@DependsOn注解指定依赖项的加载顺序,以避免出现循环依赖问题
springboot如何解决循环依赖_mere6的博客-CSDN博客
springboot启动类run方法返回值
是ConfigurableApplicationContext ,即可配置的应用上下文,参数列表第一个参数是泛型的 Class 类型参数,用于指定加载的启动类,第二个参数是一个String类型的可变参数,用于传递整个应用程序的相关参数
springboot自动配置具体实现步骤
springboot的自动配置
通过@EnableAutoConfiguration注解开启自动配置,对jar包下的spring.factories文件进行扫描,这个文件中包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在依赖的支持下进行实例化,注册到Spring容器
SpringBoot所具备的特征
(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置
三个特性: 自动配置,起步依赖, 辅助功能
SpringBoot 常用注解汇总
@SpringBootApplication, @SpringBootConfiguration, @EnableAutoConfiguration , @ComponentScan @Controller,@RestController 复合注解
@RequestBody,@RequestMapping,@GetMapping ,@PostMapping
@Repository,@Service,@Scope作用域注解,@Entity实体类注解,@Bean产生一个bean的方法,@Autowired 自动导入,@Component
,@ControllerAdvice 统一处理异常 @ExceptionHandler 注解声明异常处理方法
谈谈你对springcloud的理解
「面试必背」Spring Cloud面试题(2022最新版)_springcloud面试题_柚子茶1990的博客-CSDN博客
哪些框架用到了反射
JDBC中,利用反射动态加载了数据库驱动程序
Web服务器中利用反射调用了Sevlet的服务方法(service)。
开发工具利用反射动态解析对象的类型与结构,动态提示对象的属性和方法。
Spring 、mybatis框。注入属性,调用方法也会用到。
那些框架用到了动态代理
使用了动态代理的场景:Spring中AOP 的实现原理、RPC远程调用、Java 注解对象获取、日志框架、全局性异常处理、事务处理、权限管理、MyBatis的Mapper层接口
Spring Boot 中如何解决跨域问题
实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题