01.02 Spring IOC

一、概念

1.IOC的概念

  1. IOC控制反转
    是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。是一种概念,是一种思想。控制反转就是指把对象的控制权转移,从程序代码本身反转到了外部容器。把对象的创建、初始化、销毁工作交给spring容器去处理。由spring容器控制对象的生命周期。SpringIOC负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。)

  2. DI依赖注入
    依赖注入DI是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖外部容器,由外部容器创建后传递给程序。依赖注入是目前最优的解耦方式。依赖注入让Spring的Bean之间以配置文件的方式组织在一起,而不是以硬编码的方式耦合在一起的。

  3. IOC与DI的关系
    IOC是一个概念,是一种思想,其实现方式有很多种。当前比较流行的实现方式之一是DI

IOC:控制反转,本质就是将对象new的过程交给Spring容器去管理

二、Spring的实现

1.基本实现步骤

1.1 创建项目并导入依赖

在这里插入图片描述

1.2 创建Spring配置文件

在这里插入图片描述

1.3 添加java类

在这里插入图片描述

1.4 配置文件注册Bean类

在这里插入图片描述

1.5 Java代码实现

在这里插入图片描述

2.getBean方法

我们从IOC容器中获取对应的对象是通过getBean方法实现的,默认是调用的无参构造方法,如果不存在该方法就会抛出异常
在这里插入图片描述

2.1 根据name获取

在这里插入图片描述

2.2 根据id获取

在这里插入图片描述

2.3 根据class获取

在这里插入图片描述

2.4 组合方式获取

在这里插入图片描述

3.id和name的区别

id=“id1,d2,id3”
表示bean有一个名字,就这个名字就叫"id1,id2,id3"
name=“name1,name2,name3”
表示bean有多个名字,分别是name1、name2和name3
在这里插入图片描述
在这里插入图片描述

4.BeanFactory和ApplicationContext的区别

BeanFactory是ApplicationContext接口的一个父接口,ApplicationContext接口定义的功能肯定要比BeanFactory接口定义的功能要强大。

BeanFactory仅仅只会加载解析配置文件,并不会创建具体的实例对象

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

5.IOC对象工厂注入

工厂模式的特性
①对于调用者来说,隐藏了复杂的逻辑处理过程,调用者只关心执行结果。
②工厂要对结果负责,保证生产出符合规范的产品

5.1 静态工厂注入

通过工厂类的静态方法获取对应的实例对象

5.1.1 步骤

工厂类内创建对象的方法必须是static修饰
在这里插入图片描述
测试代码
在这里插入图片描述

5.2 动态工厂注入

通过工厂类的普通方法获取实例对象
在这里插入图片描述

6.基于配置方式的属性注入

属性注入:如何给对象的属性设值

6.1 构造注入

通过构造方法实现属性的注入,第一步需要添加对应的有参构造方法,第二部在配置文件中添加对应的配置信息
①添加有参构造方法
在这里插入图片描述

②配置文件中的配置
在这里插入图片描述
③还有一种简化方式的配置:c名称空间
在这里插入图片描述

6.2 设值注入

设值注入:就是通过bean对象的setter和getter方法来设置或获取对象的属性信息,这样一来有参构造方法就不是必须了
①setter方法是必须的
在这里插入图片描述

②配置文件信息
③简化配置:p名称空间
在这里插入图片描述

6.3 对象注入

如果初始化的属性的类型是自定义的对象,那么注入的时候可以通过ref属性来从IOC容器中获取合适的对象注入

在这里插入图片描述

6.4 集合和数组的注入

在这里插入图片描述

6.5 Map和Properties类型注入

在这里插入图片描述

7.基于注解的形式

配置文件的实现方式在bean对象比较多的情况下,配置文件会越来越复杂,这是我们可以通过扫描加注解的方式来简化我们的操作。

7.1添加AOP支持依赖

基于注解的方式需要用到AOP的支持,所以我们需要添加AOP的依赖
在这里插入图片描述

7.2 添加扫描

通过context标签的component-scan属性指定我们的扫描路径
在这里插入图片描述

7.3 @Component注解

@Component注解,被该注解表示的Java会被SpringIOC容器加载
在这里插入图片描述
在这里插入图片描述

7.4 @Resource和@Autowired

在注解的场景下依赖注入我们可以通过@Resource和@Autowired实现,他们的区别是 @Resourse默认是根据name属性来查找的,而@Autowired注解默认是根据类型查找的,@Autowired需要和@Qualifier配合实现name的查找
注入普通类型的属性是:@Value(value = “CodeTiger”)
在这里插入图片描述

7.5 注入的注解

注解描述
@Component一般在身份不明确的组件上
@Service一般在Service层
@Controller一般在控制层
@Repository一般在数据库访问层

特殊的扫描条件
在这里插入图片描述
在这里插入图片描述

8.Java配置类

Java配置类是在Spring3.x之后开始支持的,从而舍弃配置文件的形式

8.1 Java配置类的使用

Java配置类需要通过@Configuration注解标注,需要加载的实例需要通过@Bean注解标注
Java配置类的作用和applicationContext.xml的作用是一样的
在这里插入图片描述

8.2 @ComponentScan注解

基于Java配置类的实现方式中要结合@Component注解使用的话,添加扫描我们需要通过@ComponentScan或者@ComponentScans注解要实现
在这里插入图片描述

8.3 @Conditional注解

可以通过@Conditional注解去控制Bean对象的载入

8.3.1 步骤

创建一个控制条件的类,要继承Condition
在这里插入图片描述

8.4 @Profile注解

在实际开发中,我们的项目会经理许多不同的环境(开发环境,测试环境,生产环境)
applicationContext.getEnvironment().setActiveProfiles(“环境名称”); 设置对应的环境信息
applicationContext.register(java配置类); 关联配置类
applicationContext.refresh(); 刷新容器

package com.biao.spring.Entity;

public class DataSource {

    private String url;
    private String uname;
    private String pass;

    public DataSource(String url, String uname, String pass) {
        this.url = url;
        this.uname = uname;
        this.pass = pass;
    }

    @Override
    public String toString() {
        return "DataSource{" +
                "url='" + url + '\'' +
                ", uname='" + uname + '\'' +
                ", pass='" + pass + '\'' +
                '}';
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }
}

在这里插入图片描述

9.Bean的作用域

scope:默认是singleton 单例模式,每次获取的都是同一个对象
prototype 每次从容器获取的都是一个新对象

配置文件
在这里插入图片描述
Java配置类在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值