Spring框架-day03控制翻转(IOC)和依赖注入(DI)

APP直接依赖资源,这样APP会无法独立,耦合度太强

在这里插入图片描述

IOC如图所示:APP将直接寻找资源的权利交给工厂,通过工厂对象进行资源的整合,以此减少程序间的耦合度
在这里插入图片描述

IOC的概念:
	控制反转,把创建对象的权利交给框架,是框架的重要特征,
	并非面向对象编程的专用术语,它包括依赖注入(Dependency Injection)
	和依赖查找(Dependency Lookup)
IOC作用:
	削减计算机程序的耦合度(尽量减少我们代码中的依赖关系)

使用Spring的IOC解决程序耦合(IOC的唯一作用)

	目的:使用spring解决依赖关系,并不是正真的要CRUD,所以没必要写实体类,用模拟即可。
	并且使用的是java工程,并非javaWeb,
	也没必要写JavaBean

步骤:
	1.准备spring的依赖开发包(jar包)
	2.创建配置文件,导入xml 约束
	3.把对象的创建交给spring来管理

jcl是阿帕奇的日志,beans spel context core是核心容器相关的jar
aop是注解相关的jar
在这里插入图片描述

CoreContainer是一个Map,类似BeanFactory中,存储单例对象的Map
在这里插入图片描述

步骤1 准备spring的依赖开发包(jar包):
在这里插入图片描述

步骤2 创建配置文件,导入xml 约束:
步骤3 把对象的创建交给spring来管理:
在这里插入图片描述

获取核心容器ApplicationContext,根据id获取Bean对象

ApplicationContext的三个常用实现类
	ClassPathXmlApplicationContext:它可以加载类路径下的配置文件,
	配置文件必须在类路径下,不在的加载不了
	FileSystemXmlApplicationContext:可以加载磁盘任意路径下的
	有访问权限的配置文件
	AnnotationConfigApplication:用于读取注解创建容器

在这里插入图片描述
IAccountService与IAccountDao两个的实现类的打印地址
在这里插入图片描述

ApplicationContext与BeanFactory的区别:

ApplicationContext:单例对象适用,因为只创建一个对象
(也可以在配置文件中选用多例的策略创建对象)
	在构建核心容器时,创建对象采取的策略是采用立即加载的方式,
	只要一读取完配置文件,马上就创建配置文件中的配置的对象

在这里插入图片描述

BeanFactory:多例对象适用,因为对象不一样,
所以什么时候用什么时候创建
	在创建核心容器时候,采取的是延迟加载的方式,即什么时候根据
	id获取对象,什么时候创建对象

在这里插入图片描述

spring对bean的管理细节

    1.创建bean的三种方式
    2.bean对象的作用范围
    3.bean对象的生命周期

1.Bean创建的第一种方式:

	使用默认构造函数创建在spring的配置文件中使用bean标签,
	配以id和class属性后,且没有其他属性和标签时。
	采用的就是默认构造函数创建bean对象,
	此时如果类中没有默认构造函数,则对象无法创建。

xml配置:
在这里插入图片描述

类的代码(含默认构造):对象创建,代码正常运行
在这里插入图片描述

类的代码(不含默认构造):对象无法创建,程序报错
在这里插入图片描述

2.Bean创建的第二种方式:

使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,
并存入spring容器)

xml配置:
在这里插入图片描述

类中的代码:
在这里插入图片描述

3.Bean创建的第三种方式:

xml配置:在这里插入图片描述
类中的代码:
在这里插入图片描述
Bean的作用范围:

bean标签的scope属性:
	作用:用于指定bean的作用范围
	取值:常用的就是单例的和多例的
		singleton:创建单例对象(默认值)
		prototype:创建多例对象
		request:作用于web应用的请求范围
		session:作用于web应用的会话范围
		global-session:作用于集群环境的会话范围(全局
		会话范围),不是集群环境时,它就是session

集群环境(多台服务器)中的global-session
在这里插入图片描述
单例配置及代码如下:
在这里插入图片描述
在这里插入图片描述

多例配置及代码如下:
在这里插入图片描述
在这里插入图片描述

Bean对象的生命周期

	单例对象:
		出生:当容器创建时,对象出生
		存活:只要容器还在,对象一直活着
		死亡:容器销毁,对象销毁
		总结:单例对象的生命周期和容器相同

配置及代码如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

	多例对象(懒加载):
		出生:当我们使用对象时候,spring框架为我们创建
		存活:对象使用过程中就活着
		死亡:当对象长时间不用,且没有别的
		对象引用时,由Java的垃圾回收器回收

代码:单例模式的代码配置中,更改scope为prototype

依赖注入:

依赖注入:Dependency Injection
IOC:降低程序的耦合(依赖关系)
依赖关系的管理:
	1.交给spring来维护
	2.在当前类需要用到其他类的对象,由spring为我们
	提供,我们只需要在配置文件中说明。
	3.依赖关系的维护:就称之为依赖注入
	4.依赖注入:
		能注入的数据有3类:
			基本类型和String
			其他bean类型(在配置文件中或注解配置过的bean)
			复杂类型/集合类型
		注入的方式:有三种
			一:使用构造函数提供
			二:使用set方法提供
			三:使用注解提供

方式一,使用构造函数提供代码如下:

注:下方代码中没有了默认构造,在配置文件
中创建bean放入spring容器之前,必须
先将参数的值注入bean对象

在这里插入图片描述
在这里插入图片描述

方式二,使用set方法提供代码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方式三,注入复杂类型代码如下:

/**
 * 账户的业务层实现类
 */
public class AccountServiceImpl3 implements IAccountService {

    private String[] myarray;
    private List<String> mylist;
    private Set<String> myset;
    private Map<String, String> mymap;
    private Properties myprops;

    public void setMyarray(String[] myarray) {
        this.myarray = myarray;
    }

    public void setMylist(List<String> mylist) {
        this.mylist = mylist;
    }

    public void setMyset(Set<String> myset) {
        this.myset = myset;
    }

    public void setMymap(Map<String, String> mymap) {
        this.mymap = mymap;
    }

    public void setMyprops(Properties myprops) {
        this.myprops = myprops;
    }

    public void saveAccount() {
        System.out.println(Arrays.toString(myarray));
        System.out.println(mylist);
        System.out.println(myset);
        System.out.println(mymap);
        System.out.println(myprops);
    }
}

bean配置如下:

<!--
    复杂类型注入/集合类型注入
    用于给List结构集合注入的标签
        list array set
    用于给Map结构集合注入的标签
        map props
    结构相同,标签可以互换,可以只记每个结构集合只记一个就可以
-->
<bean id="accountService3"
      class="itcast.service.impl.AccountServiceImpl3">
    <property name="myarray" >
        <array>
            <value>myarrayAAA</value>
            <value>myarrayBBB</value>
            <value>myarrayCCC</value>
        </array>
    </property>
    <property name="mylist" >
        <list>
            <value>mylistAAA</value>
            <value>mylistBBB</value>
            <value>mylistCCC</value>
        </list>
    </property>
    <property name="myset" >
        <set>
            <value>mysetAAA</value>
            <value>mysetBBB</value>
            <value>mysetCCC</value>
        </set>
    </property>
    <property name="mymap" >
        <map>
            <!-- 注入值的方式一 -->
            <entry key="mapA" value="aaa"></entry>
            <!-- 注入值的方式二 -->
            <entry key="mapB" >
                <value>BBB</value>
            </entry>
        </map>
    </property>
    <property name="myprops" >
        <props>
            <prop key="propsC">ccc</prop>
            <prop key="propsD">ddd</prop>
        </props>
    </property>
</bean>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值