Spring的一些常见问题

Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性。

我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便

地协助我们进行开发。这些模块是:核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工

具、消息和测试模块。比如:Core Container 中的 Core 组件是Spring 所有组件的核心,Beans 组件

和 Context 组件是实现IOC和依赖注入的基础,AOP组件用来实现面向切面编程。

@RestController vs @Controller

Controller 返回一个页面

单独使用 @Controller 不加 @ResponseBody 的话一般使用在要返回一个视图的情况,这种情况属于

比较传统的Spring MVC 的应用,对应于前后端不分离的情况。

@RestController 返回JSON 或 XML 形式数据

但 @RestController 只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,

这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。

@Controller +@ResponseBody 返回JSON 或 XML 形式数据

如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用 @Controller 并结合

@ResponseBody 注解,也就是说 @Controller + @ResponseBody = @RestController (Spring 4 之

后新加的注解)。

@ResponseBody 注解的作用是将 Controller 的方法返回的对象通过适当的转换器转换为指定

的格式之后,写入到HTTP 响应(Response)对象的 body 中,通常用来返回 JSON 或者 XML 数

据,返回 JSON 数据的情况比较多。

Spring IOC & AOP

ioc

IoC(Inverse of Control:控制反转)是一种设计思想,就是 将原本在程序中手动创建对象的控制权

交由Spring框架来管理。 IoC 在其他语言中也有应用,并非 Spring 特有。 IoC 容器是 Spring 用来实

现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。

将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上

简化应用的开发,把应用从复杂的依赖关系中解放出来。 IoC 容器就像是一个工厂一样,当我们需要

创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的

AOP

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用

的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模

块间的耦合度,并有利于未来的可拓展性和可维护性。

Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK

Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候

Spring AOP会使用Cglib ,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理,

Spring bean

Spring 中的 bean 的作用域有哪些?

  • singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。

  • prototype : 每次请求都会创建一个新的 bean 实例。

  • request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。

  • session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。

  • global-session: 全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没

  • 有了。Portlet是能够生成语义代码(例如:HTML)片段的小型Java Web插件。它们基于portlet容

  • 器,可以像servlet一样处理HTTP请求。但是,与 servlet 不同,每个 portlet 都有不同的会话

@Component 和 @Bean 的区别是什么?

  1. 作用对象不同: @Component 注解作用于类,而 @Bean 注解作用于方法。

2. @Component 通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用

@ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的

bean 容器中)。 @Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean, @Bean 告诉

了Spring这是某个类的示例,当我需要用它的时候还给我。

3. @Bean 注解比 Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册

bean。比如当我们引用第三方库中的类需要装配到 Spring 容器时,则只能通过 @Bean 来实现。

@Bean 注解使用示例:

@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}

上面的代码相当于下面的 xml 配置

<beans>
<bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>

下面这个例子是通过 @Component 无法实现的。

@Bean
public OneService getService(status) {
case (status) {
when 1:
return new serviceImpl1();
when 2:
return new serviceImpl2();
when 3:
return new serviceImpl3();
}
}

将一个类声明为Spring的 bean 的注解有哪些?

我们一般使用 @Autowired 注解自动装配 bean,要想把类标识成可用于 @Autowired 注解自动装配

的 bean 的类,采用以下注解可实现:

  • @Component :通用的注解,可标注任意类为 Spring 组件。如果一个Bean不知道属于哪个层,

可以使用 @Component 注解标注。

  • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。

  • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。

  • @Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前

端页面。

Spring 中的 bean 生命周期?

Spring Bean的生命周期指的是从一个普通的Java类变成Bean的过程

我们知道对于普通的 Java 对象来说,它们的生命周期就是:

  • 实例化

  • 该对象不再被使用时通过垃圾回收机制进行回收

而对于 Spring Bean 的生命周期来说:

  • 实例化 Instantiation

  • 属性赋值 Populate

  • 初始化 Initialization

  • 销毁 Destruction

Bean生命周期的执行过程如下:

  • Bean 容器找到配置文件中 Spring Bean 的定义。

  • Bean 容器利用 Java Reflflection API 创建一个Bean的实例。

  • 如果涉及到一些属性值 利用 set() 方法设置一些属性值。

  • 如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName() 方法,传入Bean的名字。

  • 如果 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader() 方法,传入

ClassLoader 对象的实例。

  • 与上面的类似,如果实现了其他 *.Aware 接口,就调用相应的方法。

  • 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行

postProcessBeforeInitialization() 方法

  • 如果Bean实现了 InitializingBean 接口,执行 afterPropertiesSet() 方法。

  • 如果 Bean 在配置文件中的定义包含 init-method 属性,执行指定的方法。

  • 如果有和加载这个 Bean的 Spring 容器相关的 BeanPostProcessor 对象,执行

postProcessAfterInitialization() 方法

  • 当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。

  • 当要销毁 Bean 的时候,如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的

方法。

SpringMVC 工作原理

流程说明:

1. 客户端(浏览器)发送请求,直接请求到 DispatcherServlet 。

2. DispatcherServlet 根据请求信息调用 HandlerMapping ,解析请求对应的 Handler 。

3. 解析到对应的 Handler (也就是我们平常说的 Controller 控制器)后,开始由

HandlerAdapter 适配器处理。

4. HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求,并处理相应的业务逻辑。

5. 处理器处理完业务后,会返回一个 ModelAndView 对象, Model 是返回的数据对象, View 是个

逻辑上的 View 。

6. ViewResolver 会根据逻辑 View 查找实际的 View 。

7. DispaterServlet 把返回的 Model 传给 View (视图渲染)。

8. 把 View 返回给请求者(浏览器)

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

工厂设计模式 : Spring使用工厂模式通过 BeanFactory 、 ApplicationContext 创建 bean 对

象。

代理设计模式 : Spring AOP 功能的实现。

单例设计模式 : Spring 中的 Bean 默认都是单例的。

模板方法模式 : Spring 中 jdbcTemplate 、 hibernateTemplate 等以 Template 结尾的对数据

库操作的类,它们就使用到了模板模式。

包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访

问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。

观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。

适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了

适配器模式适配 Controller 。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值