spring之Ioc与DI
程序员文章站
2022-12-20 09:33:19
spring 的体系结构1.控制反转-Inversion Of Control工厂就是负责给我们从容器中获取指定对象的类。这时候我们获取对象的方式发生了改变。原来:我们在获取对象时,都是采用 new 的方式。是主动的。现在:我们获取对象时,同时跟工厂要,有工厂为我们查找或者创建对象。是被动的。将创建对象的权利交给框架:...
spring 的体系结构
spring的ioc是一个map结构,当有多个类型匹配时 ,在自动按照类型注入的基础上按照变量名称前往springIoc容器查找
@Autowired
自动按照类型注入。当使用注解注入属性时,set方法可以省略。它只能注入其他 bean 类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到就报错。
@Qualifier
在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和@Autowire 一起使用;但是给方法参数注入时,可以独立使用
属性:value:指定 bean 的 id。
1.控制反转-Inversion Of Control
工厂就是负责给我们从容器中获取指定对象的类。这时候我们获取对象的方式发生了改变。
原来:我们在获取对象时,都是采用 new 的方式。是主动的。
现在:
我们获取对象时,同时跟工厂要,有工厂为我们查找或者创建对象。是被动的。
将创建对象的权利交给框架:
<!--spring对bean的管理细节
1.创建bean的三种方式
2.bean对象的作用范围
3.bean对象的生命周期
-->
<!--创建bean的三种方式-->
<!--第一种方式
第一种方式 使用默认构造函数创建,
在spring的配置文件中使用bean标签,配以class和id属性,且没有其他属性和标签时,
采用的是默认构造函数创建的bean对象,此时,类中没有默认构造函数,则bean对象无法创建
<bean id="accountService" class="com.maxwell.service.impl.AccountServiceImpl"></bean>
-->
<!--第二种方式,使用普通工厂的方法创建对象,(使用某个类中方法创建对象,然后存入spring容器)-->
<!--<bean id="instanceFactory" class="com.maxwell.factory.InstanceFactory"></bean>-->
<!--<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>-->
<!--第三种方式,使用工厂中的静态方法创建对象(使用某个类中静态方法创建对象,然后存入spring容器)-->
<!--<bean id="accountService" class="com.maxwell.factory.StaticFactory" factory-method="getAccountService"></bean>-->
<!--2.bean对象的作用范围
bean标签的scope属性:
作用:指定bean的作用范围
取值:
singleton 单例的 (默认值)
prototype 多例的
request 作用于web应用的请求范围
session 作用于web应用的会话范围
global-session 作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session.
-->
<!--3.bean对象的生命周期
单例对象:
出生:当创建容器时对象出生
活着:只要容器还在,对象就一直活着
死亡:容器销毁,对象消亡
总结:单例对象的生命周期和容器相同
多例对象:
出生:当使用对象时spring框架才为我们创建对象
活着:对象只要是我们在使用过程中就一直活着
死亡:当对象长时间不用,或者没有对象引用时,由JAVA垃圾回收线程回收
-->
2.依赖注入( Dependency Injection)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--spring的依赖注入:
依赖注入:
Dependency Injection
IOC的作用:
降低程序间的耦合
依赖关系间的管理:以后都交给Spring来管理
在当前类要用到其他类的对象,由Spring为我们提供,我们只要在配置文件中说明即可
依赖关系的维护:
就称之为依赖注入
依赖注入:
能注入的数据有三类
1.基本类型和string
2.其他bean类型(在配置文件中或注解配置过的bean)
3.复杂类型/集合类型
注入的方式有三种:
1.通过构造函数提供
2.通过set方法提供
3.使用注解提供
-->
<!--1.通过构造函数提供
使用constructor-arg标签
出现的位置:在bean标签的内部
标签中的属性:
type:用于指定要注入的数据类型,该数据类型也就是构造函数中某个参数的数据类型
name:用于指定构造函数中指定名称的参数赋值
index: 用于指定要注入的数据给构造函数中指定位置的参数赋值。索引位置从0开始
=======================以上三个用于给构造函数中哪个参数赋值==========================
value:用于提供基本数据类型和String类型的数据
ref:用于指定其它的bean类型的数据,它指的是就是在Spring核心容器中出现过的对象
优势:
在获取bean对象时,注入数据是必须的,否则无法创建对象
弊端:
改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据时,也必须提供
-->
<bean id="accountService" class="com.maxwell.service.impl.AccountServiceImpl">
<!--<constructor-arg type="java.lang.String" value="test"></constructor-arg>-->
<constructor-arg name="name" value="JACK"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="new"></constructor-arg>
</bean>
<!--配置一个日期对象-->
<bean id="new" class="java.util.Date"></bean>
<!--2.通过set方法注入 -------》》更常用的方式注入
涉及的标签:property
出现的位置:bean标签的内部
标签中的属性:
name: 用于指定注入set方法名称
value: 用于提供基本数据类型和String类型的数据
ref:用于指定其它的bean类型的数据,它指的是就是在Spring核心容器中出现过的对象
优势:
创建对象时没有明确的限制,可以直接使用默认构造函数
弊端:
如果某个成员必须有值,则获取对象是有可能set方法没有执行
-->
<bean id="accountService2" class="com.maxwell.service.impl.AccountServiceImpl2">
<property name="name" value="Marry"></property>
<property name="age" value="20"></property>
<property name="birthday" ref="new"></property>
</bean>
<!--复杂类型的注入/集合类型数据的注入
用于给List结构注入的标签:
list set array
用于给map结构注入的标签有:
map props
结构相同,标签可以互换
-->
<bean id="accountService3" class="com.maxwell.service.impl.AccountServiceImpl3">
<property name="myStrs">
<array>
<value>111</value>
<value>222</value>
</array>
</property>
<property name="myList">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<property name="mySet">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<property name="myMap">
<map>
<entry key="test1" value="aaa"></entry>
<entry key="test2" value="bbb"></entry>
<entry key="test3" value="ccc"></entry>
</map>
</property>
<property name="props">
<map>
<entry key="testA" value="123"></entry>
<entry key="testB" value="456"></entry>
</map>
</property>
</bean>
本文地址:https://blog.csdn.net/m0_46539364/article/details/109584659