Java-常见面试题收集(九)

十七 Spring

1 Spring 的核心

  IoC,DI 和 AOP。
  依赖注入(Dependency Injection, DI):这是Spring框架的核心特性之一。它允许在运行时,由外部源(如配置文件、注解或环境变量)决定一个对象所依赖的其他对象。这样,代码与具体的实现解耦,提高了代码的可维护性、可测试性和松耦合性。依赖注入的主要方式有构造函数注入、Setter方法注入和接口注入。

  控制反转(Inversion of Control, IOC):这是Spring框架的另一大核心思想。它意味着将创建对象的控制权转移给Spring框架进行管理。在Spring框架中,对象的实例不再由调用者来创建,而是由Spring容器来创建,并同时负责控制对象间的关系。这样,代码与对象生命周期的管理解耦,进一步提高了代码的可维护性和灵活性。

  面向切面编程(Aspect-Oriented Programming, AOP):AOP允许程序员定义横切关注点,这些关注点在应用程序中多处重复出现,如日志记录、事务管理、安全性等。通过AOP,程序员可以将这些关注点从业务逻辑中分离出来,使得代码更加清晰和模块化。

  此外,Spring框架还包括一些核心的组件,如核心容器(Spring core),它负责创建并管理bean,以及Spring上下文(Spring context),它向Spring框架提供上下文信息。Spring的核心在于其提供的依赖注入、控制反转和面向切面编程的特性和机制,这些使得Java应用程序的开发更加灵活、可维护和可扩展。

2 Spring 管理事务的方式有几种

1.编程式事务,在代码中硬编码(不推荐使用)
2.声明式事务,在配置文件中配置(推荐使用),声明式事务又分为两种:
3.基于 XML 的声明式事务
4.基于注解的声明式事务(推荐)

3 Spring AOP

  与 OOP 对比,面向切面,传统的 OOP 开发中的代码逻辑是至上而下的过程中会长生一些横切性问题,这些横切性的问题和我们的主业务逻辑关系不会散落在代码的各个地方,造成难以维护,AOP 的编程思想就是把业务逻辑和横切的问题进行分离,从而达到解耦的目的,使代码的重用性和开发效率高(目的是重用代码,把公共的代码抽取出来),本质底层使用动态实现的

4 Spring AOP 中有哪些不同的通知类型

  Spring AOP(面向切面编程)中包含了五种不同的通知类型,每种类型都在特定的连接点(Join Point,即程序执行中的某个特定点)执行特定的逻辑。这五种通知类型分别是:

  前置通知(Before Advice):在目标方法执行之前执行。它无法阻止目标方法的继续执行,除非它抛出一个异常。

  后置通知(After Returning Advice):在目标方法成功执行之后执行。如果目标方法通过抛出异常退出,则不会执行此类型的通知。

  异常通知(After Throwing Advice):在目标方法通过抛出异常退出时执行。它通常用于记录异常信息或进行异常处理。

  最终通知(After (finally) Advice):无论目标方法通过何种方式退出(正常返回或异常退出),该通知都会执行。它类似于Java语言中的finally块。

  环绕通知(Around Advice):环绕通知是最强大的通知类型,它将目标方法封装起来,可以在方法调用之前和之后自定义行为,甚至可以完全控制是否调用目标方法。

  这些通知类型使得开发者能够在不修改现有代码的情况下,向程序添加额外的逻辑,如日志记录、事务管理、性能监控等,从而实现代码的解耦和复用。

5 Spring AOP 的应用场景

1.记录日志
2.监控方法运行时间(监控性能)
3.权限控制
4.缓存优化(第一次调用查询数据库,将查询结果放入内存对象,第二次调用,直接从内存对象返回,不需要查询数据库)
5.事务管理(调用方法前开启事务, 调用方法后提交关闭事务 )

6 Spring 中的常用注解

#声明 bean 的注解(IoC 注解)
@Service 在业务逻辑层使用
@Repository 在数据访问层使用
@Controller 在展现层使用,控制器的声明
@Component 组件,没有明确的角色
注入 bean 的注解(DI 注解)
@Autowired:由 Spring 提供
@Value 为属性注入值,由 Spring 提供
@Inject:由 JSR-330 提供
@Resource:由 JSR-250 提供
java 配置类相关注解
@Configuration 声明当前类为配置类,相当于 XML 形式的 Spring 配置(类上)
@Bean 注解在方法上,声明当前方法的返回值为一个 bean,替代 XML 中的方式(贴方法上)
@Configuration 声明当前类为配置类,其中内部组合了 @Component 注解,表明这个类是一个 bean(类上)
@ComponentScan 用于对 Component 进行扫描,相当于 XML 中的(类上)
切面(AOP)相关注解
@Aspect 声明一个切面(类上)
@PointCut 声明切入点(方法上)
@After 在不管方法执行情况下最终都要执行(方法上)
@AfterThrowing 在方法执行抛出异常时执行(方法上)
@AfterReturning 在方法正常执行之后执行(方法上)
@Before 在方法执行之前执行(方法上)
@Around 在方法执行之前与之后执行(方法上)
在 java 配置类中使用 @EnableAspectJAutoProxy 注解开启 SpringAspectJ 代理的支持(类上)
@Bean 的属性支持
@Scope 设置 Spring 容器如何新建 bean 实例(方法上,得有 @Bean)其设置类型包括:
singleton (单例,一个 Spring 容器中只有一个 bean 实例,默认模式)
protetype (每次调用新建一个 bean)
request (web 项目中,给每个 http request 新建一个 bean 实例)
session (web 项目中,给每个 http session 新建一个 bean 实例)
application(给 web 项目中 servletContext 新建一个 bean 实例)
@StepScopeSpring Batch 中还有涉及
@PostConstructJSR-250 提供,在构造函数执行完之后执行,等价于 XML配置文件中 bean 的 initMethod
@PreDestoryJSR-250 提供,在 Bean 销毁之前执行,等价于 XML 配置文件中 bean 的 destroyMethod
环境切换
@Profile 通过设定 EnvironmentActiveProfiles 来设定当前 context 需要使用的配置环境。(类或方法上)
@Conditional Spring4 中可以使用此注解定义条件话的 bean,通过实现Condition 接口,并重写 matches 方法,从而决定该 bean 是否被实例化。(方法上)
异步相关
@EnableAsync 配置类中,通过此注解开启对异步任务的支持,叙事性AsyncConfigurer 接口(类上)
@Async 在实际执行的 bean 方法使用该注解来申明其是一个异步任务(方法上或类上所有的方法都将异步,需要 @EnableAsync 开启异步任务)
定时任务相关
@EnableScheduling 在配置类上使用,开启计划任务的支持(类上)
@Scheduled 来申明这是一个任务,包括 cron,fixDelay,fixRate 等类型(方法上,需先开启计划任务的支持)
@Enable 注解
@EnableAspectJAutoProxy 开启对 AspectJ 自动代理的支持
@EnableAsync 开启异步方法的支持
@EnableScheduling 开启计划任务的支持
@EnableWebMvc 开启 Web MVC 的配置支持
@EnableConfigurationProperties 开启对 @ConfigurationProperties 注解配置 bean 的支持
@EnableJpaRepositories 开启对 SpringData JPA Repository 的支持
@EnableTransactionManagement 开启注解式事务的支持
@EnableCaching 开启注解式的缓存支持测试相关注解
@RunWith 运行器,Spring 中通常用于对 JUnit 的支持

7 Spring MVC 常用注解

@EnableWebMvc 在 配 置 类 中 开 启 Web MVC 的 配 置 支 持 , 如 一 些ViewResolver 或 者 MessageConverter 等 , 若 无 此 句 , 重 写WebMvcConfigurerAdapter 方法(用于对 Spring MVC 的配置)

@Controller 声明该类为 Spring MVC 中的 Controller

@RequestMapping 用于映射 Web 请求,包括访问路径和参数(类或方法上)

@ResponseBody 支持将返回值放在 response 内,而不是一个页面,通常用户返回 JSON 数据(返回值旁或方法上)

@RequestBody 允许 request 的参数在 request 体中,而不是在直接连接在地址后面(放在参数前)

@PathVariable 用于接收路径参数,比如 @RequestMapping("/hello/{name}")申明的路径,将注解放在参数中前,即可获取该值,通常作为 RESTful 的接口实现方法

@RestController 该 注 解 为 一 个 组 合 注 解 , 相 当 于 @Controller@ResponseBody 的组合,注解在类上,意味着,该 Controller 的所有方法都默认加上了 @ResponseBody

@ControllerAdvice 通过该注解,我们可以将对于控制器的全局配置放置在同一个位置,注解了 @Controller 的类的方法可使用 @ExceptionHandler@InitBinder@ModelAttribute 注 解 到 方 法 上 , 这 对 所 有 注 解 了@RequestMapping 的控制器内的方法有效

@ExceptionHandler 用于全局处理控制器里的异常

@InitBinder 用来设置 WebDataBinderWebDataBinder 用来自动绑定前台请求参数到 Model@ModelAttribute 本 来 的 作 用 是 绑 定 键 值 对 到 Model 里 , 在@ControllerAdvice 中是让全局的 @RequestMapping 都能获得在此处设置的键值对

8 Spring MVC 的流程

1.用户发送请求至前端控制器 DispatcherServlet2.DispatcherServlet 收到请求后,调用 HandlerMapping 处理器映射器,请求获取 Handler3.处理器映射器根据请求 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet4.DispatcherServlet 调用 HandlerAdapter 处理器适配器;

5.HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器)6.Handler 执行完成返回 ModelAndView7.HandlerAdapter 将 Handler 执 行 结 果 ModelAndView 返 回 给DispatcherServlet8.DispatcherServlet 将 ModelAndView 传给 ViewResolver 视图解析器进行解析;

9.ViewResolver 解析后返回具体 View10.DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中);

11.DispatcherServlet 响应用户

9 Spring MVC 怎样设定重定向和转发

  转发(默认):在返回值前面加 “forward:”,譬如 “forward:employee/queryOne?name=Taylor”
  重定向:在返回值前面加 “redirect:”,譬如 “redirect:https://www.bilibili.com/”

10 Spring 框架中用到了哪些设计模式

  Spring框架在设计和实现过程中广泛应用了多种设计模式,以优化系统结构、提高代码可维护性和扩展性。以下是Spring框架中使用的一些主要设计模式:

  单例模式(Singleton Pattern):在Spring框架中,Bean默认是单例的,即在整个应用上下文中只会有一个Bean的实例。这通过容器管理来实现,确保了Bean的唯一性和共享性。

  工厂模式(Factory Pattern):Spring中的BeanFactory和ApplicationContext是工厂模式的典型应用。它们负责根据配置信息或注解来创建和管理Bean实例,隐藏了具体对象的创建细节,提供了一种灵活的方式来管理对象的生命周期。

  代理模式(Proxy Pattern):Spring的AOP功能使用了代理模式。在运行时,Spring会为被代理的对象创建一个代理对象,代理对象会拦截并增强被代理对象的方法调用,从而在不修改原代码的情况下添加新的功能。

  观察者模式(Observer Pattern):Spring的事件机制就是观察者模式的一个应用。事件发布者发布事件,而事件监听器订阅并处理这些事件。当事件发生时,所有订阅了该事件的监听器都会收到通知并执行相应的操作。

  模板方法模式(Template Method Pattern):Spring的JdbcTemplate、HibernateTemplate等模板类就是模板方法模式的应用。它们定义了操作的流程,而将一些具体细节(如SQL语句)留给子类或调用者来实现。

  依赖注入(Dependency Injection, DI):虽然依赖注入本身并不直接对应某个设计模式,但它是一种重要的编程思想和技术,在Spring框架中得到了广泛应用。通过依赖注入,Spring框架能够管理对象之间的依赖关系,降低了代码之间的耦合度。

  除了上述设计模式外,Spring框架还使用了其他设计模式,如装饰器模式(用于增强对象的功能)、适配器模式(Spring AOP 的增强或通知(Advice)使用到了适配器模式、SpringMVC 中也是用到了适配器模式适配 Controller。)等。这些设计模式的应用使得Spring框架更加灵活、可扩展和易于维护。

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泰勒疯狂展开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值