知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停地来唤醒记忆深处的知识点。
Q1。什么是Spring框架?
Spring是最流行的企业应用程序框架之一。Spring框架的核心基于依赖注入设计模式,该模型允许我们解耦依赖关系。
Q2。Spring有什么好处?
Spring Framework使构建企业Java应用程序更加容易
优点:
- IoC容器:Spring使用其IoC容器管理Spring Bean和配置的生命周期,这使项目管理和维护更加容易。
- 灵活性:Spring提供了将其与任何基于Java的技术集成的灵活性。
- 控制反转:Spring将负责为我们的应用程序注入所需的依赖关系,不再需要我们手动搜索和为我们的应用程序注入所需的依赖关系。
- 轻量级:Spring包含彼此之间具有最小依赖性的不同模块,这使其轻巧灵活。
- 端到端开发:Spring框架为应用程序开发的所有方面提供模块,范围从依赖注入,持久性,缓存,业务,Web,REST,它是用于开发所有类型的基于Java的企业应用程序的生态系统。
- 事务管理:框架为事务管理提供了抽象和透明层。这提供了一个可插拔的体系结构,我们可以在不更改核心系统的情况下注入不同的事务管理器。
- AOP:它支持面向方面的编程(AOP)。AOP解决了 跨领域关注的问题。
- 非侵入性:Spring不会强迫我们使用任何基于Spring的接口或扩展任何基于Spring的类以使用其功能,这些功能赋予了将其与其他技术结合使用的灵活性。例如,我们可以使用@Inject不是基于Spring的注解的注解来注入依赖项。
- 异常处理:Spring Framework提供了多个选项,以更好,更灵活的方式处理异常。
Q3。什么是依赖注入?
依赖注入是一种技术,使我们可以使我们的项目松散耦合,并使用一些注解将它们定义为bean注入必需的依赖@Service,@Component,@Repository,@Controller或@Bean注解。
Q4。什么是Spring IOC容器?
Spring IoC容器是Spring框架的核心管理系统。它负责创建,配置和管理这些对象的生命周期。容器通过读取以XML配置或注解形式提供的配置元数据来获取有关实例化,配置和组装哪些对象的指令,能够表达组成应用程序的对象以及这些对象之间的丰富相互依赖关系。
Q5。Spring提供哪些不同的IOC容器?
Spring Framework提供以下两种类型的容器。
- BeanFactory容器:这是Spring框架中可用的基本容器,支持依赖项注入(DI)。 org.springframework.beans 和 org.springframework.context 包是Spring框架IoC容器的基础。
- ApplicationContext的容器:将ApplicationContext 增加更多的企业特定的功能。该 ApplicationContext 是对一个完整的超集 BeanFactory.
Q6。Spring支持哪些类型的依赖注入技术?
Spring支持三种类型的依赖注入
- 基于Setter的依赖注入。
- 基于构造函数的依赖注入。
- 基于字段注入
Q7。Spring支持哪些bean作用域?
Spring支持低于7个作用域。
- singleton
- prototype
- request
- session
- application
- websocket
- globalSession
Q8。解释Spring中的bean作用域?
Bean作用域定义了Bean的生命周期。
- singleton(默认*)
为每个Spring IoC容器的单个对象实例限定单个bean定义。
- prototype
为多个对象实例的单个bean定义范围。
- request
将单个bean定义的范围限定为单个HTTP请求的生命周期;也就是说,每个HTTP请求都将在单个bean定义的后面创建一个自己的bean实例。仅在实现了 web-aware的Spring ApplicationContext中有效。
- session
将单个bean定义的范围限定为HTTP Session的生命周期。仅在实现了 web-aware的Spring ApplicationContext中有效。
- globalSession
将单个bean定义的作用域限定为全局HTTP会话的生命周期。通常,仅在portlet上下文中使用时才有效。仅在实现了 web-aware的Spring ApplicationContext中有效。
Q9。Spring中bean的默认范围是什么?我们如何在应用程序中更改默认范围?
默认情况下,Spring bean是单例作用域。要在我们的应用程序中更改默认的bean作用域,我们应该实现 BeanFactoryPostProcessor接口,并重写postProcessBeanFactory()方法来设置所需的bean作用域。
public class CustomScopedPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException {
for (String beanName: factory.getBeanDefinitionNames()) {
BeanDefinition beanDefinition = factory.getBeanDefinition(beanName);
beanDefinition.setScope("prototype");
}
}
}
Q10。如何在Spring中创建自定义范围?
从Spring 2.0开始,Spring中的bean作用域机制是可扩展的。这意味着它不仅为Spring开箱即用提供的bean作用域,还可以定义自己的作用域。在Spring中阅读 Custom Scope, 以了解如何在应用程序中创建和使用自定义范围。
Q11。在Spring Bean注入推荐方法是什么?
将依赖项注入Spring组件的推荐方法是使用构造函数注入。其次是所需的任何强制性依赖项。对于可选的依赖项,请使用setter注入。
Q12。Spring有哪些不同的模块/子项目?
- Spring Core.
- Spring JDBC
- ORM Module
- Spring AOP
- Spring MVC
Q13。Spring框架中使用了哪些设计模式?
- Singleton作用域bean中的Singleton模式
- Spring MVC中的模型视图控制器模式
- Spring DAO支持中的数据访问对象
- Spring Dispatcher Servlet中的前端控制器
- Spring JDBC支持中的模板方法模式
- Spring MVC和Spring Web中的适配器模式
- Spring AOP支持中的代理模式
- Bean Factory类中的工厂模式
Q14。什么是Spring配置文件?
Spring概要文件使我们能够基于dev,test,pro等概要文件来配置Spring Bean。可以根据不同的环境,自由选择当前对应环境的对应配置文件,这也是体现在Spring的灵活性方面。
Q15。@Required注解有什么作用?
该@Required注解适用于bean属性setter方法。此注解表明,必须在配置时填充受影响的bean属性。如果所需的依赖项不可用,则容器将抛出 BeanInitializationException异常。
public class ShowCart {
private CartService cartService;
@Required
public void setCartService(CartService cartService) {
this.cartService = cartService;
}
// ...
}
Q16。@Autowired注解有什么作用?
该 @Autowired 注解用于与字段或用于通过类型注入bean方法。这个注解允许Spring解析协作bean并将其注入所需的bean中。
Q17。@Qualifier注解有什么作用?
当同一bean的实例很多时,@Qualifier注解会有所帮助。让我们举一个例子,其中两个bean实现相同的接口。
public interface CartService {
public void addToCart();
}
@Component(value = "cartService")
public class DefaultCartService implements CartService {
@Override
public void addToCart() {
System.out.println("Add to cart");
}
}
@Component(value = "customCartService")
public class CustomCartService implements CartService {
@Override
public void addToCart() {
System.out.println("custom add to cart service");
}
}
此注解与@Autowired注解紧密配合。为了注入CustomCartService我们的代码AddToCartService,我们使用@Autowired 和 @Qualifier注解。如果我们不使用@Qualifier,Spring抛出NoUniqueBeanDefinitionException.
@Component
public class AddToCartService {
@Autowired
@Qualifier("customCartService")
private CartService cartService;
public void addToCart() {
cartService.addToCart();
}
Q18。@Primary注解有什么作用?它的重要性是什么?
@Primarary注解显示,当有多个候选条件可以自动装配时,它应该给Bean一个优先级。
public interface CartService {
public void addToCart();
}
@Component
public class DefaultCartService implements CartService {
@Override
public void addToCart() {
System.out.println("Add to cart");
}
}
@Primary
@Component
public class CustomCartService implements CartService {
@Override
public void addToCart() {
System.out.println("custom add to cart service");
}
}
因为 CustomerCartService 标记为 @Primary,所以DefaultCartService假设它们在相同的Spring应用程序上下文中都作为bean存在,它将优先于变体注入。
Q19。在Spring项目中,我们可以通过几种方式处理异常?
- 通过@ExceptionHandler在控制器级别使用注解。
- 使用HandlerExceptionResolver,我们可以在整个应用程序级别处理异常。
- 通过使用@ControllerAdvice注解,我们可以为应用程序级控制配置异常处理程序,并且仍然保持代码非常干净和模块化。
Q20。@ Component,@ Controller,@ Service和@Repository之类的注解之间有什么区别?
总而言之,@Component注解是通用注解。因此,无论是控制器,服务还是存储库,都是组件。有关细节,让我们看一下其中的每个:
- @Controller:此批注启用@RequestMapping对类中批注的检测。
- @Service:它表明该类处理了应用程序的业务逻辑,应调用@Repository类进行数据库交互。
- @Repository:这表明该类定义了一个DB接口。它确保特定于平台的异常再次捕获并作为Spring特定的未经检查的异常再次抛出。
Q21。Singleton设计模式和Spring Singleton范围有什么区别?
Singleton设计模式与Spring Singleton范围之间的比较像。(GoF)一书中定义的Singleton设计模式指的是每个ClassLoader仅一个实例的对象的范围 。Spring Singleton bean 被称为“每个bean和每个容器一个实例”。为了进一步了解它,让我们看下面的示例