Spring
Spring Framework
特性
非侵入式:轻量级,对应用程序本身的结构影响非常小,对领域模型可以做到零污染。
控制反转:IOC inversion of control,反转资源获取方向,不再自己创建资源,而是环境将资源准备好。
面向切面编程:AOP aspect oriented programming,在不修改源代码的基础上增强代码功能。 对扩展开放,对修改关闭!
容器:Spring IOC是一个容器,包含并管理组件对象的生命周期。
组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用。在Spring中可以使用xml和注解组合这些对象。
声明式:很多以前需要编写代码才能实现的功能,现在只需要声明需求即可由框架代为实现。
一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。
IOC
IOC容器思想
DI依赖注入
Dependency Injection
IOC是一种反转控制的思想,DI是IOC的一种具体实现方式,可以使用约定好的方式为类的某些成员变量赋值,这些成员是该类所依赖的其他类。
IOC容器在spring中的实现
BeanFactory
IOC容器的基本实现,但是是面向Spring本身的,不提供给开发人员使用。
ApplicationContext
BeanFactory的子接口
ApplicationContext的实现类
FileSystemXmlApplicationContext用文件路径,不常用
ClassPathXmlApplicationContext用类路径,常用
容器管理的对象叫做组件,也叫Bean
基于XML管理Bean
创建实体类,然后创建xml文件,在idea中可以选择xml配置文件中的spring文件选项。
在beans标签中配置子标签bean,里面写的类可以在IOC容器中调用
获取IOC容器后,可以调用容器的getBean方法获取实例。该方法是使用反射机制调用无参构造方法创建对象的。
获取Bean的三种方式:
通过name(配置文件中bean的id)获取
ioc.getbean(“name”)
通过类型获取
ioc.getBean(类.class)
通过类型获取实例时,在配置文件中必须有且只有一个对应的id,不然会抛异常。但通过name获取时没有这个问题。
通过name和类型共同获取
ioc.getBean("name" , 类.class)
与方法一类似,但是不需要强转了,第一种返回的是Object类型,这种返回的是对应类型。
注:当接口只有一个实现类在配置文件中,也可以通过接口类型获取实例,当实现类不唯一且有多个被配置进了配置文件中,则不可以。
依赖注入
set注入
在bean标签中可以给实例的属性进行赋值
<property name="sid" value="1001" />普通类型用value直接赋值
<property name="dept" ref="" />引用类型用ref赋值
构造器注入
在bean标签中可以用子标签constructor-arg调用有参构造
<constructor-arg value="1001" />
<constructor-arg value="张三" type="" name="" index=""/>
各种值得赋值方法
对基本类型赋值
字面量类型
直接在value=" "中写
null
<property name="">
<null />
</property>
XML实体
对于<>需要用< >代替
CDATA节
<property name="">
<value>
<![CDATA[这里面的东西<><><><><><><>会被原样解析]]>
</value>
</property>
CDATA不能用在value属性后面的冒号里面,必须用在标签中
对类类型赋值
引用外部Bean
在Property标签中的ref="name" 中设置引用的类型
被引用的类型必须也被配置在IOC容器的配置文件中
级联方式
先引用一个外部的bean进行实例化,防止null,然后利用点的方式对该类内部的属性进行操作赋值。
<property name="clazz" ref="clazzOne">
<property name="clazz.cid" value="1234">
<property name="clazz.cname" value="classOne">
内部Bean方式
在property中配置bean标签
<property name="clazz">
<bean id="clazzInner" class="com.darkpar.pojo.Clazz">
<property name="cid" value="4321"/>
<property name="cname" value="classTwo"/>
</bean>
</property>
内部Bean只能在当前Bean中使用,不能通过IOC容器获取
对数组类型赋值
在property标签中使用array子标签进行赋值
<property name="hobby">
<array>
<value>抽烟</value>
<value>喝酒</value>
<value>烫头</value>
</array>
</property>
对集合类型赋值
对List类型赋值
在property标签中使用list子标签进行赋值
<property name="students">
<list>
<ref bean="studentOne" />
<ref bean="studentTwo" />
<ref bean="studentThree" />
</list>
</property>
创建List类型的bean
配置集合的Bean需要引入util约束在使用util约束中的标签时最好带上前缀,防止重名
Idea会自动添加
xmlns:util="http://www.springframework.org/schema/util"
<util:list id="studentList">
<ref bean="studentOne" />
<ref bean="studentTwo" />
<ref bean="studentThree" />
</util:list>
对Map类型进行赋值
在property中使用子标签map,在map标签中使用entry标签填写单个键值对
<property name="teacherMap">
<map>
<entry key/key-ref="" value/value-ref="">
</map>
</property>
创建map类型的bean
<util:map id="teacherMap">
<entry key/key-ref="" value/value-ref="">
</util:map>
使用p命名空间进行赋值
在idea中打出p:后,可以引入p的约束,然后p:作为bean的属性,其中会出现所有的属性,每个属性两个,一个对应value,一个对应ref。
<bean id="student" class="com.darkpar.pojo.Student
p:sid="1001" p:tearchMap-ref="teacherMap">
</bean>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!