1、基本概念
Spring:
- 开源的轻量级的java开发框架,目的是提高开发人员的开发效率以及系统的可维护性。
- 核心功能是支持IOC(控制反转)和AOP(面向切面编程)
- 可以很方便地对数据库进行访问、可以很方便地集成第三方组件(电子邮件,任务,调度,缓存等等)、对单元测试支持比较好、支持 RESTful Java 应用程序的开发。
- 是很多模块的集合:包括core-container(spring-core、spring-beans)、AOP(spring-aop、spring-aspects)、data access(spring-jdbc、spring-orm)、spring web(spring-web、spring-mvc、spring-websocket)、messaging、spring test
2、IOC
- 思想:IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。这样可以实现类与类之间的松散耦合,这样在手动创建一个对象的时候就不需要关心其依赖对象的构造方法。
- 具体实现:将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。使用xml或者注解将某类配置为bean,使用@autowired注解就可以实现依赖注入。
(1)IoC 容器:实际上就是个 Map(key,value),Map 中存放的是各种对象。
IOC容器主要作用有以下几个方面:
-
实现依赖注入(Dependency Injection,DI):指的是应用程序在运行时依赖IOc容器来动态注入组件所需要的某个依赖对象。Spring 的DI具体就是通过反射实现注入的,反射允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性等。
-
管理Bean的生命周期:IoC容器负责创建、初始化、销毁Bean对象,并缓存Bean实例,以提高性能和降低资源消耗。
(2)spring bean:Bean 代指的就是那些被 IoC 容器所管理的对象。
Java Bean主要用于表示实体对象、业务逻辑对象、数据访问对象等,并且广泛应用于Java EE和桌面应用程序中。在Spring框架中,Bean是指被IoC容器管理的对象实例,常见的Bean类型包括Service、Dao、Controller等。
(3)声明为bean的注解有:
@Component
:通用的注解,可标注任意类为Spring
组件。如果一个 Bean 不知道属于哪个层,可以使用@Component
注解标注。@Repository
: 对应持久层即 Dao 层,主要用于数据库相关操作。@Service
: 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。@Controller
: 对应 Spring MVC 控制层,主要用于接受用户请求并调用Service
层返回数据给前端页面。
(4)@Component和@bean的区别:
@Component
注解作用于类,而@Bean
注解作用于方法。@Component
通常是通过类路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用@ComponentScan
注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean
注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean
告诉了 Spring 这是某个类的实例,当我需要用它的时候还给我。@Bean
注解比@Component
注解的自定义性更强,而且很多地方我们只能通过@Bean
注解来注册 bean。比如当我们引用第三方库中的类需要装配到Spring
容器时,则只能通过@Bean
来实现。
(5)注入bean的注解有:@autowired、@resource、@inject
@autowired和@resource区别:
@Autowired
是 Spring 提供的注解,@Resource
是 JDK 提供的注解。Autowired
默认的注入方式为byType
(根据类型进行匹配),@Resource
默认注入方式为byName
(根据名称进行匹配)。- 当一个接口存在多个实现类的情况下,
@Autowired
和@Resource
都需要通过名称才能正确匹配到对应的 Bean。Autowired
可以通过@Qualifier
注解来显式指定名称,@Resource
可以通过name
属性来显式指定名称
(6)bean的作用域:
Spring 中 Bean 的作用域通常有下面几种:
- singleton : IoC 容器中只有唯一的 bean 实例。Spring 中的 bean 默认都是单例的,是对单例设计模式的应用。
- prototype : 每次获取都会创建一个新的 bean 实例。也就是说,连续
getBean()
两次,得到的是不同的 Bean 实例。 - request (仅 Web 应用可用): 每一次 HTTP 请求都会产生一个新的 bean(请求 bean),该 bean 仅在当前 HTTP request 内有效。
- session (仅 Web 应用可用) : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean(会话 bean),该 bean 仅在当前 HTTP session 内有效。
- application/global-session (仅 Web 应用可用):每个 Web 应用在启动时创建一个 Bean(应用 Bean),该 bean 仅在当前应用启动时间内有效。
- websocket (仅 Web 应用可用):每一次 WebSocket 会话产生一个新的 bean。
(7)bean的生命周期:
3、AOP
- AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑代码(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
- Spring AOP 就是基于动态代理的,如果要代理的对象,要增强某个功能,将增强的逻辑 代码通过切入点织入到目标对象,进而生成代理对象。
(1)Spring AOP 与AspectJ AOP区别:
- Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。
- Spring AOP 基于动态代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。
- AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单,
- 如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比 Spring AOP 快很多。
4、Spring用到了哪些设计模式?
- 工厂设计模式 : Spring 使用工厂模式通过
BeanFactory
、ApplicationContext
创建 bean 对象。 - 代理设计模式 : Spring AOP 功能的实现。
- 单例设计模式 : Spring 中的 Bean 默认都是单例的。
- 模板方法模式 : Spring 中
jdbcTemplate
、hibernateTemplate
等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。 - 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
- 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
- 适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配
Controller
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)