熟悉 Spring 框架

对 Spring 框架的理解

Spring 框架是当前最流行的 Java 框架之一。在 Spring 中,它认为一切 Java 类都是资源,都是 Bean,容纳这些 Bean 的 Spring 提供 IOC 容器。所以说 Spring 是一个轻量级的 Java Bean 容器,它为应用程序的开发提供了基础框架的支持。

什么是 Bean?

每一个被 Spring 管理的 Java 对象都称之为 Bean 。

什么是 POJO?

Plan Old Java Object,即无任何限制的普通 Java 对象。

核心理念 —— IOC 和 AOP

IOC

控制反转

对象创建的控制权由应用程序转移到 Spring 容器

举个例子:

以前新建一个对象我们要在应用程序主动 new 一个对象,并给对象的属性赋值

使用 Spring 的情况:容器负责对象的创建管理

依赖注入

组件之间的依赖关系由容器在运行期决定。

形象的来说,即由容器动态的将某种依赖关系注入到组件之中。如果不使用 IOC 容器的话,可能需要我们通过构造函数在初始化类的时候注入。

Spring 的官方文档解释:一个应用程序往往是由许多类组成的,那类和类之间又会有很多依赖关系。所谓依赖注入就是说 Spring 在初始化管理一个类的时候会同时将这个类依赖的类注入进入(初始化)。

用处

控制反转(Inversion of Control)是通过依赖注入实现的,降低对象之间耦合关系 的设计思想。一般来说,在分层体系结构中,都是上层调用下层的接口,依赖注入最直接的体现是 @AutoWired@Resource 这个注解。

上层调用下层的接口,上层依赖于下层的执行,也就是调用者依赖被调用者,而通过 IOC 方式,使得上层不再依赖下层的接口,通过注入实例化对象来选择不同的下层实现,来实现控制反转。

采用 IOC 机制可以提高系统的可扩展性。Spring 容器将会根据配置文件来创建调用者对象,同时把被调用的实例化对象通过 构造函数 或者 set() 方法的形式注入到调用者对象中。

IOC优点

  1. 通过 IOC 容器,开发人员不需要关注对象是怎么去创建的,同时增加新的类也比较方便了。

  2. IOC 容器可以通过配置文件来确定需要注入的实例化对象,因此很方便进行单元测试。

声明 Bean 的注解

  • @Component组件:没有明确的角色
  • @Service:在业务逻辑层使用
  • @Repository:在数据访问层使用
  • @Controller:在展现层(MVC–Spring MVC)使用

注入Bean的注解(标注在属性或set方法上,一般都是标注属性上)

  • @Autowired:Spring提供的注解
  • @Inject:JSR-330提供的注解
  • @Resource:JSR-250提供的注解

扫描包的注解

  • @ComponentScan:自动扫描包名下所有使用 @service、@Component 等的类,并注册为 Bean

AOP

面向切面编程(Aspect Oriented Programming)是面向对象开发的一种补充,它允许开发人员在 不改变原来模型 的基础上 动态的 去修改模型用来满足新的需求。

例如,开发人员可以在不更改原来业务逻辑模型的基础上动态的增加日志,安全或者异常处理的功能。

AOP 的基本概念

  1. Aspect(切面):通常是一个类,里面可以定义切入点和通知
  2. JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
  3. Advice(通知):AOP 在特定的切入点上执行的增强处理,有 before, after, afterReturning, afterThrowing, around
  4. Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
  5. AOP代理:AOP 框架创建的对象,代理就是目标对象的加强。Spring 中的 AOP 代理可以使 JDK 动态代理,也可以是 CGLIB 代理,前者基于接口,后者基于子类。

Spring 支持 AspectJ 的注解式切面编程

  1. 使用 @Aspect 声明是一个切面
  2. 使用 @After、@Before、@Around 定义建言,可直接将拦截规则作为参数
  3. 其中 @After、@Before、@Around 参数的拦截规则作为切点(PointCut),为了使切点复用,可使用 @PointCut 专门定义拦截规则,然后在 @After、@Before、@Around 的参数值中调用
  4. 其中符合条件的每一个被拦截处为连接点(JointPoint)。

实现代理的两种代理方式

静态代理
  1. 针对具体的类编写代理类。
  2. 针对一个接口编写一个代理类。
动态代理
  1. JDK Proxy。
  2. CGLIB 代理。

Spring 对于有接口的类使用 JDK Proxy,对于无接口的类和抽象类使用 CGLIB 代理。虽然 CGLIB 可以进行代理,但是存在例外,就是代理类中 不能出现 final 修饰的类,或者 类中有 final 修饰的方法

模块

1. Spring AOP

采用了面向切面的思想,使 Spring 框架管理对象支持 AOP ,同时这个模块也提供了事务管理,可以不依赖具体的 EJB 组件,就可以将事务管理集成到应用程序中。同样提供对面向切面支持的还有 Spring aspects。

2. Spring ORM

提供了对现有的 ORM 框架的支持,例如 Hibernate,JDO,Mybatis 等。

同样提供数据获取方面支持的 Spring 模块还有:Spring JDBC,Spring OXM, Spring TX, Spring JMS。

3. Spring DAO

提供了对数据访问对象(Data Access Object,DAO)模式和 JDBC 的支持,把实现业务逻辑和数据库访问的代码实现分离等。

4. Spring Web

提供了 Servlet 的 Context 和 Web 应用的上下文,同时还集成了一些现有的 Web 框架,如 Struts 。

5. Spring Context

提供了 ApplicationContext 的实现。扩展核心容器,提供了 Spring 上下文环境,给开发人员提供了有用的服务。

6. Spring Web MVC

提供了一个构件 Web 应用程序的 MVC 实现。

7. Spring Core

Spring 框架的核心容器,他提供了 Spring 框架的基本的功能,这个模块最主要的是 BeanFactory ,它使用工厂模式来创建所需要的对象,同时 Beanfactory 使用 IOC 的思想,通过读取 XML 文件的方式来实例化对象。

Spring 常用配置

Bean 的 scope

Spring 容器如何新建 Bean 的实例,通过 @Scope 来实现。

  1. Singleton: 一个 Spring 容器中只会有一个 Bean 实例,是 Spring 的默认配置,全容器共享一个实例。(单例模式)
  2. Prototype: 每次调用新建一个 Bean 实例。
  3. Request: Web 项目中,给每一个 http request 新建一个 Bean 实例。
  4. Session: Web 项目中,给每一个 http session 新建一个 Bean 实例。
  5. GlobalSession: 给每一个 global http session 新建一个 Bean 实例。

Spring EL(Spring 表达式语言)

用来注入资源(普通文件、网址、配置文件、系统环境变量等)。

Spring 主要在注解 @Value 的参数中使用表达式。

参考

  1. 面试官:看你简历上写熟悉Spring框架,谈谈对Spring的理解
  2. IOC和DI的概念,以及Spring框架的介绍
  3. 熟悉spring框架
全部评论

相关推荐

10-31 14:54
已编辑
门头沟学院 算法工程师
点赞 评论 收藏
分享
球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务