XC面经速记

三大特性是封装继承多态,五大原则是SOLID
SOLID是一组面向对象设计原则的缩写,包括以下五个原则:

S - 单一职责原则(Single Responsibility Principle):一个类应该只有一个引起它变化的原因。

O - 开放封闭原则(Open/Closed Principle):软件实体(类、模块、函数等等)应该对扩展开放,对修改关闭。

L - 里氏替换原则(Liskov Substitution Principle):子类可以替换父类并且不影响程序正确性。

I - 接口隔离原则(Interface Segregation Principle):客户端不应该被迫依赖它不需要的接口。

D - 依赖倒置原则(Dependency Inversion Principle):高层模块不应该依赖低层模块,两者都应该依赖于抽象;抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

简单来说,这五个原则都是为了使软件设计更加健壮、易于扩展和维护,具体内容可以概括为:单一职责原则要求一个类只做一件事情;开放封闭原则要求软件实体对扩展开放,对修改关闭;里氏替换原则要求子类可以替换父类而不影响程序正确性;接口隔离原则要求客户端不应该依赖它不需要的接口;依赖倒置原则要求高层模块不应该依赖低层模块,两者都应该依赖于抽象。
SOLID--single respinsedi--open closed --- liskov substitution---interface segregation--dependency inversion
单一职责-用户管理只负责管理不负责注册--开放关闭--继承开放修改关闭--L子类可以代替父类完成所有--I接口隔离-不实现不必要的接口--D依赖倒转--依赖于抽象的消息发送器而不是依赖于具体的邮件发送或者短信
全部评论
构造函数注入无法解决循环依赖的问题是因为,在构造函数注入的情况下,如果存在循环依赖,那么就会发生死锁。 具体来说,如果A类和B类互相依赖,A类需要B类的实例,而B类也需要A类的实例,那么在创建A类实例时,就需要先创建B类实例,而在创建B类实例时,又需要先创建A类实例,这就形成了循环依赖。如果采用构造函数注入,那么在创建A类实例时,就会先创建B类实例,但是在创建B类实例时,由于需要依赖A类实例,因此会暂停B类实例的创建,等待A类实例的创建完成,但是由于A类又需要依赖B类实例,因此也会暂停A类实例的创建,等待B类实例的创建完成,这就形成了死锁。 因此,构造函数注入无法解决循环依赖的问题,需要使用其他方式来解决,比如Spring使用三级缓存的方式来解决循环依赖。
点赞 回复 分享
发布于 2023-03-16 19:25 日本
spring的循环依赖主要是指两个类相互之间通过@Autowired自动依赖注入对方,即类A包含一个类B的对象引用并需要自动注入,类B包含一个类A的对象引用也需要自动注入。 对于循环依赖问题,spring根据注入方式的不同,采取不同的处理策略,对于双方都是使用属性值注入或者setter方法注入,则spring可以自动解决循环依赖注入问题,应用程序可以成功启动;对于双方都是使用构造函数注入对方或者主bean对象(Spring在启动过程中,先加载的bean对象)使用构造函数注入,则spring无法解决循环依赖注入,程序报错无法启动。
点赞 回复 分享
发布于 2023-03-16 19:24 日本
请求(request)和会话(session)作用域的Bean的例子: 请求作用域的Bean:一个网站的访问日志,需要记录每个请求的IP地址、访问时间、请求的URL等信息。可以将这些信息封装到一个请求作用域的Bean中,在每个请求处理过程中,将这个Bean注入到对应的控制器中,由控制器进行处理和记录。 会话作用域的Bean:一个购物网站的购物车功能,需要在用户的会话中保存用户的购物车信息,如购物车中的商品、数量、总价等信息。可以将这些信息封装到一个会话作用域的Bean中,在用户登录后创建或者从数据库中加载这个Bean,将其保存在用户的会话中,由后续的请求对其进行操作和更新。当用户退出或者超时后,将这个Bean从用户的会话中移除或者销毁。
点赞 回复 分享
发布于 2023-03-16 19:21 日本
singleton:默认作用域,一个 Bean 的实例在整个应用中都是共享的。适用于那些状态无关的、无状态的 Bean,如 DAO、Service 等。 prototype:每次请求都会创建一个新的实例,适用于多线程环境和短暂的对象,如 Action、Controller 等。 request:每次 HTTP 请求都会创建一个新的实例,适用于 Web 应用程序中需要在每个请求之间共享数据的 Bean。 session:每个 HTTP 会话都会创建一个新的实例,适用于 Web 应用程序中需要在每个会话之间共享数据的 Bean。 application:整个 Web 应用程序都共享一个实例,适用于在整个 Web 应用程序中需要共享数据的 Bean,如缓存、系统配置等。 在非 Web 应用程序中,只有 singleton 和 prototype 两种作用域可用,通常情况下都是使用默认的 singleton 作用域。应该根据实际情况选择适当的作用域,以提高应用程序的性能和可扩展性。
点赞 回复 分享
发布于 2023-03-16 19:20 日本
DAO(Data Access Object,数据访问对象)是一种设计模式,用于将数据存储访问代码从业务逻辑中分离出来。DAO 通常负责处理与数据库或其他数据存储的交互,它们封装了对数据库的所有访问,包括增删改查等操作。DAO 的使用可以减少业务逻辑代码和存储访问代码的耦合性,使得应用程序更易于维护和扩展。 在 Java 中,DAO 是指实现了对数据库的访问的类。DAO 类通常包含了执行数据库操作的方法,比如增删改查等,以及与数据库相关的配置信息,如数据源、连接池等。DAO 类可以是单例的,也可以是短暂的,具体取决于应用程序的需要。 Spring 框架提供了对 DAO 的支持,包括 JDBC、ORM 等方式,使得开发者可以更轻松地访问和操作数据库。在使用 Spring 的 DAO 功能时,开发者只需要编写 DAO 接口和相应的实现类,然后使用 Spring 的 IoC 容器将 DAO 实例注入到其他组件中即可。这样,应用程序的其他部分就可以使用 DAO 方法,而不需要关心具体的数据存储细节。
点赞 回复 分享
发布于 2023-03-16 19:19 日本
compile:通常使用的第三方框架的 jar 包这样在项目实际运行时真正要用到的 jar 包都是以 compile 范围进行依赖的。比如 SSM 框架所需jar包。 test:测试过程中使用的 jar 包,以 test 范围依赖进来。比如 junit。 provided:在开发过程中需要用到的“服务器上的 jar 包”通常以 provided 范围依赖进来。比如 servlet-api、jsp-api。而这个范围的 jar 包之所以不参与部署、不放进 war 包,就是避免和服务器上已有的同类 jar 包产生冲突,同时减轻服务器的负担。说白了就是:“服务器上已经有了,你就别带啦!” ———————————————— 版权声明:本文为CSDN博主「渣渣敲代码」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_27181955/article/details/124579238
点赞 回复 分享
发布于 2023-03-16 18:54 日本
在Spring框架中,Aware接口是一组特殊的接口,用于获取Spring容器中的一些资源或者组件,它们通常用来扩展Bean的功能或者对Bean进行自定义配置。 通过实现Aware接口,Bean就可以获取到Spring容器中的各种资源或者组件,如BeanFactory、ApplicationContext、Environment、ResourceLoader、MessageSource等。Aware接口的实现方式非常简单,只需要在Bean中添加对应的接口实现即可。
点赞 回复 分享
发布于 2023-03-16 18:41 日本
Bean属性注入:将配置文件或注解中定义的属性值通过setter方法注入到Bean实例中。 BeanNameAware:设置Bean的名称。 BeanFactoryAware/ApplicationContextAware:设置Bean所在的工厂和上下文环境。
点赞 回复 分享
发布于 2023-03-16 18:40 日本
初始化前中后 PreInitialization:在Bean初始化之前执行自定义的初始化操作。 InitializingBean/自定义init-method:在Bean初始化之后执行自定义的初始化操作。 PostInitialization:在Bean初始化之后执行自定义的初始化操作。
点赞 回复 分享
发布于 2023-03-16 18:39 日本
Bean生命周期可以分为实例化、属性赋值、初始化、使用和销毁--
点赞 回复 分享
发布于 2023-03-16 18:39 日本
具体地,通过反射机制实例化一个类的对象通常需要以下步骤: 获取类对象:使用Class类的静态方法forName(String className)或者使用类.class语法来获取要实例化的类的Class对象。 获取构造函数:使用Class类的getConstructor(Class[] parameterTypes)方法或者getDeclaredConstructor(Class[] parameterTypes)方法来获取类的构造函数对象。 创建实例对象:使用Constructor类的newInstance(Object[] initargs)方法来创建类的实例对象。
点赞 回复 分享
发布于 2023-03-16 18:33 日本
延迟实例化:BeanFactory采用延迟实例化的策略,即在第一次获取Bean时才会进行实例化,而ApplicationContext采用预实例化的策略,即在容器启动时就会对所有的Bean进行实例化。 BeanPostProcessor的处理:在BeanFactory中,BeanPostProcessor的处理是在Bean实例化之后进行的,而在ApplicationContext中,BeanPostProcessor的处理是在BeanDefinition加载时就进行的。
点赞 回复 分享
发布于 2023-03-16 18:24 日本
Spring容器是一个轻量级的Java对象容器,它用于管理和组织应用程序中的Java对象。Spring容器负责创建、组装和管理Java对象之间的依赖关系,从而简化了应用程序的开发和维护过程。 Spring容器有两种类型:BeanFactory和ApplicationContext。BeanFactory是Spring容器的基础接口,它提供了一种基本的对象实例化和依赖注入机制。ApplicationContext是BeanFactory的扩展,它提供了更多的功能,比如事件传播、国际化、资源管理、AOP等。 Spring容器的主要功能包括对象的实例化、配置和组装,以及对象的生命周期管理。在Spring容器中,Java对象被称为Bean,它们由容器负责管理和组织。容器根据配置文件中的信息来实例化Bean,并将它们组装成一个完整的应用程序。 Spring容器通过依赖注入(Dependency Injection)来管理对象之间的依赖关系。依赖注入是一种面向对象编程的设计模式,它将对象之间的依赖关系从程序代码中抽离出来,并由容器负责管理。通过依赖注入,我们可以更加灵活地组装应用程序,并可以实现松耦合的设计。 Spring容器是Spring框架的核心组件,它为应用程序提供了丰富的功能和强大的扩展性。同时,Spring容器还提供了一些扩展点和接口,使得开发者可以定制和扩展容器的功能,满足不同应用场景的需求。
点赞 回复 分享
发布于 2023-03-16 18:23 日本
DispatcherServlet是Spring MVC框架的核心控制器,它负责处理所有的客户端请求并将请求分发给相应的控制器进行处理。 在Spring MVC框架中,DispatcherServlet是整个框架的核心。它拦截所有的HTTP请求,并将请求分发给相应的控制器进行处理。DispatcherServlet还负责管理视图解析器、处理器映射器和拦截器等组件,从而实现了整个Spring MVC框架的完整功能。 在DispatcherServlet中,每个请求都被封装为一个HttpServletRequest对象,并在内部创建一个HandlerExecutionChain对象来表示当前请求的处理链。然后,DispatcherServlet会遍历处理器映射器,查找与当前请求匹配的处理器,并将处理器包装成HandlerAdapter对象。接着,DispatcherServlet会调用拦截器链来对当前请求进行拦截处理。最后,DispatcherServlet将请求委托给HandlerAdapter对象进行处理,并将处理结果封装成一个ModelAndView对象返回给客户端。 通过DispatcherServlet的处理,Spring MVC框架能够将所有的请求和响应都封装为对象,并将请求分发给相应的控制器进行处理,从而实现了Web应用程序的高效、可扩展和易于维护。
点赞 回复 分享
发布于 2023-03-16 18:22 日本
在Spring框架中,Bean是一个被Spring容器所管理的Java对象。Bean是应用程序的核心,可以通过Spring容器配置和组装成一个完整的应用程序。Spring容器负责创建、配置和管理Bean的生命周期,包括实例化、属性赋值、初始化和销毁等操作。 Bean的定义通常通过XML文件或者注解的方式进行,定义包括Bean的名称、类型、作用域、构造方法、属性、初始化方法和销毁方法等信息。Spring容器根据这些定义创建和管理Bean实例。 Spring框架提供了很多功能,比如依赖注入、面向切面编程、事务管理等,这些功能都是基于Bean来实现的。因此,Bean是Spring应用程序的基础和核心,通过Bean的管理,Spring实现了很多高级特性和功能,帮助开发者更加高效地开发应用程序。
点赞 回复 分享
发布于 2023-03-16 18:21 日本

相关推荐

不愿透露姓名的神秘牛友
06-19 14:35
点赞 评论 收藏
分享
收到了小米的实习offer,犹豫是否要去。。。
认真搞学习:雷总还当过首富呢,公司不算大厂算独角兽吗
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务