Spring及IOC容器学习笔记!

spring是什么?

简单来说,spring是一个轻量级的开源的javaEE框架,用来解决企业开发过程中的复杂性。spring有两个核心:IOC和AOP。
IOC:控制反转:把创建对象的过程以及调用的过程交给spring管理。
AOP:面向切面:不修改源代码的情况下进行功能增强。
spring特点:

①:方便解耦,简化开发
②:Aop编程支持
③:方便程序测试
④:方便与其他框架结合
⑤:方便事务操作
⑥:降低API开发的难度

首先我们出创建maven项目,将我们所需要的的包都导进去,也可以直接导webmvc的包,这个包基本包含我们所需要的包。

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.0.RELEASE</version>
</dependency>

在这里插入图片描述

初次使用步骤:

①:加载配置文件。
②:获取配置创建的对象。

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        //加载配置文件,这里的传递的参数是相对于src下的路径
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        //获取配置创建的对象,第一个参数是你配置文件中的id值,第二个是你的对象的class
        User user = applicationContext.getBean("user", User.class);
        user.show();
    }
}

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

IOC容器

什么是IOC

①:控制反转,把对象创建的对象之间的调用过程交给spring管理
②:目的:为了降低耦合度

IOC底层原理:xml解析,工程模式,反射
画图讲解:
图片来自于尚硅谷

IOC接口:

①:IOC是基于IOC容器完成,IOC容器底层就是对象工厂。
②:Spring提供接口:
BeanFactory:IOC容器基本实现,是spring内部基本接口,不提供开发人员使用。(加载配置文件时不会创建对象,只有在使用的时候才会创建对象)
ApplicationContext:BeanFactory接口的子接口,提供更多功能呢,供开发人员使用。(加载配置文件的时候就会创建对象)

IOC操作Bean管理

什么是Bean管理:
Bean管理指的就是两个操作,即spring创建对象,spring注入属性。

Bean管理操作的两种方式
(1):基于xml配置文件方式实现
(2):基于注解方式实现

IOC操作Bean管理(基于xml方式):

1.基于xml方式创建对象
在这里插入图片描述
创建对象的时候,默认的是执行无参的构造。
在这里插入图片描述
测试代码和上面的一样就不再上图片了
结果:会报红(这里只截取一部分)
在这里插入图片描述
基于xml方式注入属性:
(1)DI:依赖注入,就是注入属性
第一种注入方式:通过set方法进行注入。

类中没有set方法
在这里插入图片描述
类中有set方法
在这里插入图片描述
结果:
在这里插入图片描述
第二种注入方式:使用有参构造函数进行注入

配置文件:
在这里插入图片描述
user类:
在这里插入图片描述
测试类:
在这里插入图片描述
第三种注入方式:p名称空间注入(简化注入方式)

在配置文件中写上这么一行:xmlns:p=“http://www.springframework.org/schema/p”
在这里插入图片描述

IOC操作Bean管理:
字面量:
(1):允许空值:
在这里插入图片描述
给User中的userName赋空值

(2):属性值包含特殊符号
在property标签中对指定的name赋有特殊符号的值,比如书名,带有"《》",一种方法是用 “&lt ;” "&gt ;"转义,
第二种方法就是下面的方法在value标签中写上<![CDATA[值]]>
在这里插入图片描述
注入属性-IOC注入外部Bean:
配置文件不仅可以配置基本类型,也可以配置引用类型
在这里插入图片描述
注入属性-IOC内部Bean注入以及级联赋值
在这里插入图片描述
这里只附上配置文件:
在这里插入图片描述

XML注入集合属性
在这里插入图片描述
测试结果:
在这里插入图片描述
如果说要注入引用类型的数据,那么以上的配置文件就会发生改变。这里新新写了一个Address类
在这里插入图片描述
抽取集合:
在这里插入图片描述

IOC容器-工厂模式

Spring有两种类型Bean,一种是普通Bean,一种是工厂Bean(FactoryBean)
普通Bean:返回值类型与配置文件中的类型一致。
工厂Bean:返回值类型与配置文件中的类型可以不一致。
要想实现工厂Bean,就要让你配置文件中的类实现FactoryBean接口,并重写里面的方法。

IOC-Bean的作用域

作用域:即scope属性,可以通过设置写表示作用域
在默认情况下,创建Bean实例是单实例,即创建多个对象,它们的地址是一样的。
图片来自尚硅谷
那么如何配置是单实例还是多实例?bean标签中有scope属性来设置实例,scope=“singleton” 单实例 scope=“prototype” 多实例,那么它们有什么区别呢?singleton在配置的时候就会创建对象,prototype在你程序创建对象的时候才会创建对象。

Bean的生命周期

在这里插入图片描述
Bean的生命周期实际有7步,在初始化方法的前后各有一步,都是把Bean实例传递给后置处理器的方法。后置处理器有两个方法,一个是在初始化之前执行的方法,一个是在初始化之后执行的方法。要实现后置处理器,首先要创建类来实现BeanPostProcessor接口,然后重写两个方法。
在这里插入图片描述

自动装配

什么是自动装配: 根据指定装配规则,Spring自动将匹配的属性值注入。
在bean标签中有autowire属性,它有两个值byName和byType。
byName:通过对象名注入,这就要求你注入的bean值的id要与类属性名一致。
byType:通过属性类型注入,但同属性的对象不能有多个,否则就不会知道找那个对象。

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

外部属性文件

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

IOCBean管理注解方式

什么是注解?

注解就是代码的特殊标记。格式:@注解名称(属性名称=属性值,属性名称=属性值…)
目的:简化xml的配置

基于注解方式创建对象

第一步:使用注解需要使用aop的包

第二部:开启组件扫描
<context:component-scan base-package=“com.study” />

第三步:创建类,在类上面写上注解创建对象
@Component(value = “animal”) 这样相当于xml文件中的
在这里插入图片描述

基于注解方式实现属性注入

  • @Autowired
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component(value = "animal")
@Scope(value = "singleton")
public class Animal {

    @Value("狗")
    private String name;

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

(2)@Qualifier(和AutoWired一起使用)
在这里插入图片描述

(3)@Resource
在这里插入图片描述

(4)@Value(注入普通属性)
在这里插入图片描述
完全注解开发
使用完全注解开发避免了使用xml进行配置,但是较为复杂的情况还要使用xml进行配置

//config类
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "com.study")
public class AnnoConfig {
}

//Test类import com.study.config.AnnoConfig;
import com.study.dao.AnimalDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AnnoConfig.class);
        AnimalDao animalDao = context.getBean("animalDao", AnimalDao.class);
        animalDao.showInof();
    }
}

//AnimalDao类
import com.study.pojo.Animal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

@Repository(value = "animalDao")
public class AnimalDao {
    @Autowired
    @Qualifier(value = "animal")//value指向Animal类上的Component注解的values值
    private Animal animal;

    public void showInof(){
        System.out.println(animal.getName()+"###########");
    }
}


//Animal类
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component(value = "animal")
@Scope(value = "singleton")
//也可以通过Import注解将别的配置类导入进来
@Import(value = {Config1.class,Config2.class})
public class Animal {

    @Value("狗")
    private String name;

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值