Spring,Spring Ioc,Bean详解
Spring框架
Spring框架是Java应用最广的框架,其的成功来自于理念,并非是技术,其中几个理念非常重要,例如IoC(控制反转),AOP(面向切面编程)
Spring的优势
低耦合/低侵入(解耦)
- Spring通过IoC(控制反转)和DI(依赖注入)来实现低耦合高内聚
声明式事务管理
- Spring基于AOP的方式,使其能够在方法执行前后字段处理事务的开启,提交和回滚
优势:
- 使得开发者只需要关注业务逻辑,事务的工作提交给Spring自动处理
- 减少代码冗余
方便集成其他框架
- Spring的核心优点是其极强的集成能力,通过SpringORM可以轻易的集成MyBatis等框架
降低 Java 开发难度
- Spring 提供了自动配置功能,尤其是 Spring Boot.开发者无需关注繁琐的配置,Spring 会根据项目的依赖自动完成配置
Spring 框架中包括了 J2EE 三层的每一层的解决方案(一站式)
- Spring 提供了企业级应用开发的完整解决方案,包括 表示层(Web 层)、业务层(Service 层)和 数据层(DAO 层)的支持。
- 表示层(Web 层):Spring MVC 提供了强大的 Web 功能,支持传统的 Web 应用和 RESTful API。
- 业务层(Service 层):Spring 的核心就是提供面向业务逻辑的功能,包括事务管理、AOP、数据访问等。
- 数据层(DAO 层):Spring 提供了对数据库的支持,简化了 JDBC 操作,并且通过 ORM 提供了对 Hibernate、JPA 等框架的集成。
Sprinp主要框架结构
- Spring重要框架结构由核心容器(Core Container).数据访问/集成(Data Access/Integration),Web,面向切面编程(AOP和Aspects),设备(Instrumentation),消息(Messaging)和测试(Test)组成,其结构图如下:
## **Core Container 核心容器**
> Core Container又是由,Spring Core,Spring Beans, Spring Context,SpEL,组成
>
- Spring Core
- Spring Core是IoC和DI基本实现
- 核心功能包括`BeanFactory,ApplicationContext`,提供Spring IoC对容器的访问
- Spring Beans
- 负责管理对象(Bean)的生命周期,配置和依赖注入.是IoC的容器的基础,可使用XML或注解方式定义Bean
- Spring Context
- 基于ApplicationContext接口,Spring容器的高级抽象
## Data Access/Intergration 数据访问于集成模块
- Spring JDBC
- 简化了传统的JDBC操作,提供`JDBCTemplate`类来处理数据库连接,SQL执行和结果集处理,减少冗余
- Spring ORM
- 集成了ORM(对象关系映射,为对象和数据库之间提供映射支持,简化数据访问层的开发
- Spring Data Access
- 提供对数据库访问的简化支持,包括Mybatis,Hibernate的持久化框架
## Web
- Spring Web MVC
- 基于MVC设计模式的Web框架,是Spring架构中最常用的模块之一
- Spring Web
- 为Web应用提供基本的支持,提供Servlet API和文件上传等功能
Maven中配置Spring
- 在pom.xml文件中添加两个依赖即可,注意Spring版本
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.14</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
Spring IoC理念
Spring IoC,反转控制,更好的理解是,IoC不是说明技术而是一种设计理念,把原本程序手动创建对象的控制权,交给Spring框架来管理
IoC的形象理解
IoC虽然是一个抽象的概念,我们可以举个例子更好的理解
以购物的视角解析IoC
假设你想买个橙汁喝,有两种方法可以实现
- 主动创建(没有IoC)
- 想喝一杯新鲜的橙汁,按住传统的方法,需要去买果汁机,橙子,榨汁,加水,才能喝到
- 主动创建:这些行为都是,我主动发起的,自己去的所有的步骤,我直接掌管所有的步骤和资源.
- 饮品店方式(IoC)
- 但还有一种方式是,点外卖或去饮品店购买.
- 控制反转:在这种情况下,并不用去采购果汁机,橙汁等等.饮品店负责完成所有的工作,而我只是负责提出需求等待结果即可
这可以见的,在Spring框架中,IoC的核心思想就是:我不在主动执行任务和管理资源,而是提交给第三方,让它们处理我提出的需求,这就是IoC.我不再控制对象的创建和管理,而是由外部容器来管理和提供我所需要的”服务”
类比到SpringIoC
- 在刚刚的例子中,我们可以类比到Spring框架中,具体来说:
- 我(客户端):负责提出需求,比如需要一个橙汁
- 饮品店(Spring 容器):接收需求,并负责制作并交付结果,即进行Bean的创建和注入
- 结果:我只需接收并使用”橙汁”(bean),不需要知道如何制作它(创建和管理)
IDEA如何使用IoC的
通过Spring Config xml文件(能看懂就行)
- 在resource文件下建立Spring Config文件名为
spring.xml
- 使用bean标签来配置Spring IoC中的对象,其基本语法如下
id
:为指定该Bean的名称.这个名称没有在Spring容器中引用这个Beanclass
:指定该Bean的单位完整路径- 通过注释配置的方法会在<常用的注释>展开讲解
Bean
Bean代表了Spring IoC容器管理的对象,Spring容器负责创建,配置和管理这些Bean
什么是Bean
- Bean是Spring IoC容器管理的一个对象,简单来说任何一个由Spring创建并由容器管理的Java对象,都是一个Bean
- 对于Spring 容器来说,其主要负责:
- 创建Bean实例
- 配置Bean属性
- 管理Bean生命周期
- 处理Bean的依赖注入
Bean的配置
在Spring中,一共有一下几个方式来配置Bean:
- XML文件配置(较为传统,能看懂就行)
- 注解配置(Java现代方式)
- Java配置类(Spring 通过
@Configuration
注解配置)
XML配置方式
- 在Spring的XML配置文件中,使用标签配置bean,上面已经演示过
- 通过注释配置的方法会在<常用的注释>展开讲解
依赖注入(DI)
DI(Dependency Injection)是Spring IoC容器的核心功能之一,通过DI,spring实现了控制反转IoC,依赖注入有两种常用方法:构造函数注入和Setter方法注入
构造函数注入
构造函数注入是通过类的构造方法将依赖传递给Bean
配置方法
在Spring配置文件中,通过
constructor-arg
标签来指定构造函数参数
标签属性
name
:指定构造函数的名称,用于匹配构造函数参数value
:为参数提供值ref
:指定引用类型的Bean(其他Bean),用于注入对象type
:指定参数的类型(通常不使用,spring会自动推断)index
:指定参数在构造函数中的索引位置
e.g1注入基本数据类型
<bean id="student" class="com.mashang.entity.Student">
<!--构造函数参数注入-->
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg name="age" value="20"></constructor-arg>
</bean>
该配置,Spring会将
”张三”
和18
作为参数传递给Student类的构造函数.其会调用带有name和age的构造函数public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
返回的
toString()
如下:
e.g2注入引用类型
<bean id="classInfo" class="com.mashang.entity.ClassInfo">
<constructor-arg name="name" value="班级1"></constructor-arg>
<constructor-arg name="classId" value="001"></constructor-arg>
</bean>
<bean id="student" class="com.mashang.entity.Student">
<!--构造函数参数注入-->
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg name="age" value="20"></constructor-arg>
<!--注入引用类型-->
<constructor-arg name="classInfo" ref="classInfo"></constructor-arg>
该配置是在
Student
类中有一个ClassInfo
类,提供constructor-arg
标签,Spring会将Class
Info类的Bean
注入到Student
类的构造函数中private ClassInfo classInfo; public Student(String name, Integer age, ClassInfo classInfo) {
this.name = name;
this.age = age;
this.classInfo = classInfo;
}返回的
toString()
如下:
Setter注入是提供对象的set方法将依赖传递给Bean.容器实例化后,会通过反射的机制调用Bean的set方法来注入依赖想
配置方法
在Spring配置文件中,通过
property
标签来为Bean的属性设置值.属性的名称对于Java类中的set方法
- 标签属性
name
:要注入的属性名value
:为基本数据类型和String
类型的属性赋值ref
:为引用类型的属性赋值,指定其他Bean
e.g1注入基本数据类型
<bean id="student" class="com.mashang.entity.Student">
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
</bean>
上述配置中,
student
必须带有setName
和setAge
的方法来接收传入的值e.g2传入引用类型
<bean id="classInfo" class="com.mashang.entity.ClassInfo">
<property name="name" value="班级1"></property>
<property name="classId" value="001"></property>
</bean>
<bean id="student" class="com.mashang.entity.Student">
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
<property name="classInfo" ref="classInfo"></property>
</bean>
Spring,Spring Ioc,Bean详解的更多相关文章
- Spring自动装配Bean详解
1. Auto-Wiring ‘no’ 2. Auto-Wiring ‘byName’ 3. Auto-Wiring ‘byType 4. Auto-Wirin ...
- (转)java之Spring(IOC)注解装配Bean详解
java之Spring(IOC)注解装配Bean详解 在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看 ...
- spring在IoC容器中装配Bean详解
1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean ...
- Spring二 Bean详解
Bean详解 Spring框架的本质其实是:通过XML配置来驱动Java代码,这样就可以把原本由java代码管理的耦合关系,提取到XML配置文件中管理.这样就实现了系统中各组件的解耦,有利于后期的升级 ...
- [Spring学习笔记 1 ] Spring 简介,初步知识--Ioc容器详解 基本原理。
一.Spring Ioc容器详解(1) 20131105 1.一切都是Bean Bean可是一个字符串或者是数字,一般是一些业务组件. 粒度一般比较粗. 2.Bean的名称 xml配置文件中,id属性 ...
- Spring Bean 详解
Spring Bean 详解 Ioc实例化Bean的三种方式 1 创建Bean 1 使用无参构造函数 这也是我们常用的一种.在默认情况下,它会通过反射调⽤⽆参构造函数来创建对象.如果类中没有⽆参构造函 ...
- spring框架 AOP核心详解
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...
- Spring各个jar包详解
Spring各jar包详解 spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar,aspects.jar, spring-portlet.jar, and sprin ...
- Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现
前文,我们分析了Spring IOC的初始化过程和Bean的生命周期等,而Spring AOP也是基于IOC的Bean加载来实现的.本文主要介绍Spring AOP原理解析的切面实现过程(将切面类的所 ...
- Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建
上文我们介绍了Spring AOP原理解析的切面实现过程(将切面类的所有切面方法根据使用的注解生成对应Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor).本文在此基 ...
随机推荐
- Cisco Packet Tracer 交换机代码
二层交换机S1代码: >en #conf t #vlan 10 #vlan 20 #int r f 0/1-5 #sw a v 10 #int r f 0/6-10 #sw a v 20 #i ...
- P9150 邮箱题
P9150 邮箱题 Alex_Wei 做法妙. 思路 首先我们可以建出两张图,一张是按照题目的要求形成的有向图,一张是由有向边 \((i,k_i)\) 形成的钥匙图. 在钥匙图中,每个点有且仅有一入度 ...
- golang WEB框架Hertz --- 获取参数
安装Hertz命令行工具 请确保您的Go版本在1.15及以上版本,笔者用的版本是1.18 配置好GO的环境后,按照Hertz的命名行工具 go install github.com/cloudwego ...
- Windows 使用 Intel(R) Arc(TM) GPU 推理ONNX 模型
这不刚换了一个笔记本电脑,Thinkpad T14P,带有Intel ARC GPU,今天我们来尝试用这个GPU来推理ONNX模型. 环境安装 查阅了相关文档,最好使用py310环境,其他版本可能存在 ...
- 一条语句查看web日志排名前十的IP/URL页面及总数
查看 Nginx web 访问日志访问量前十的ip 以及访问的网站页面地址 ,可以分析网站哪些页面受欢迎,以及访问量大的ip在干什么! 标签: <无> 代码片段(3)[全屏查看所有代码] ...
- Redis集群搭建-多服务器
条件 l 基于redis5.0.*版本进行集群的搭建 l 集群要求至少六个节点,即每个主节点配置1个从节点,本集群是使用了3个主节点并每个下面挂一个从节点,三个主节点分布在3台服务器上 l 集群配置信 ...
- Codeforces Round 859 (Div
F. Bouncy Ball 给定\(n×m\)矩形,起点\(st\),终点\(ed\),有一小球从起点出发,每次可以选择4个方向,如果碰到边界就反弹,询问最后能否到达终点 题解:\(DFS\) + ...
- 前端好用API之MutationObserver
前情 一直以来都没有好的方式可以监听元素变化,Mutation events虽然可以监听DOM树结构变化,但是因性能问题和差的兼容问题(Webkit内核不支持)并不推荐使用. MutationObse ...
- MQ系列 | RabbitMQ 消息确认机制
RabbitMQ 消息确认机制 温馨提示:基于JDK17.SpringBoot 2.1.8.RELEASE 版本,由于RabbitMQ 在 SpringBoot3+ 的配置项有所不同, 所以请严格按照 ...
- NetCore2.2升级到3.1总结
最近公司要求netcore版本从2.2升级到3.1,升级需要修改的配置项和遇到的问题我这边做一个简单的总结. 可参考资料: https://docs.microsoft.com/zh-cn/aspne ...