Spring day01知识点复习 容器Ioc和DI

0 阅读3分钟

Spring特点

SpringFrame

1.ioc

2.aop

3.事务处理

Spring有很多优良特性

非侵入式

依赖注入

面向切面编程

容器

组件化

一站式

image.png

组件和容器

组件:具有一定功能的对象

容器:管理组件(创建,获取,保存,销毁)

一个常见的容器:

组件Servlet

容器Servlet

e4b9b063-d115-4159-8c13-9f443a6e2221.png

IOC 和 DI

Ioc控制反转

控制:资源的控制权

反转:和传统的方式不一样

DI 依赖注入(通过反射赋值)

依赖:组建的依赖关系,如NewsController依赖NewsServices

注入:通过setter方法,构造器,等方式自动注入

通过依赖注入实现的控制反转IOC

容器-注册

实验一 把组件放到容器


package com.huawei.springday01ioc.Bean;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;

/**
 *这个是主入口类
 *
 */
@SpringBootApplication
public class SpringDay01IocApplication {
        //跑起来一个Spring应用  ApplicationContext: Spring应用上下文对象:IOC容器
    public static void main(String[] args) {
       ConfigurableApplicationContext  context=  SpringApplication.run(SpringDay01IocApplication.class, args);


       String[] names = context.getBeanDefinitionNames();
       for(String name:names){
           System.out.println(name);

       }


    }


    @Bean
    public Person person(){
    Person person =new Person();
    person.setAge(18);
    person.setName("张三");
    person.setGender("男");
        return person;

    }

实验二 获取容器中的组件的名字 类型 作用域

@Bean("name")


    //总结
    //1.组件不存在抛异常
    //2.组件不唯一
    //3.组件唯一,正常运行

   //4.1根据名字获取Bean
    Object hahaha = context.getBean("hahaha");
    System.out.println(hahaha);

    //4.2根据类型获取Bean
    Person bean = context.getBean(Person.class);
    System.out.println(bean);

    //4.3根据组件类型获取这种类型的所有对象

    Map<String, Person> beansOfType = context.getBeansOfType(Person.class);
    System.out.println(beansOfType);


}

创建时机:容器启动过程中会创建组件对象

组件是单实例的

实验三 @Configuration注解

组件:框架的底层配置 配置文件 配置类(也是容器中的组件)

image.png

实验四--实验七 @Controller @Service @Repository @Component

实验八 @ComponentScan 批零扫描

分层注解能起作用的前提,这些组件必须在主程序所在的包及其子包的结构下

@ComponentScan(Pac)

二、为什么需要 @ComponentScan?

在没有 @ComponentScan 的情况下,Spring 不知道去哪里找 Bean:

java

// 没有 @ComponentScan,这个类不会被发现
@Repository  // 注解写了也没用,Spring 找不到
public class UserRepository {
    // ...
}

结论:只有被 @ComponentScan 扫描到的包下的注解类,才会被注册到容器中。

实验9 @Import注解 导入第三方组件

第三方组件导入两种方式

@Bean自己new,注册给容器

@import(xxxx) 最好写在配置类里

实验10 @Scope注解 调整组件作用域

image.png

实验11 @Lazy懒加载

//容器启动之前不会获取Bean对象 什么时候加载 什么时候获取

FactoryBean

用于创建比较复杂的对象 @Component

package com.huawei.springday01ioc.factory;

import com.huawei.springday01ioc.Bean.Car;
import org.jspecify.annotations.Nullable;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

@Component
public class BYDfactory implements FactoryBean<Car> {


    @Override
    public @Nullable Car getObject() throws Exception {

            Car car =new Car();
            return car;



    }

    @Override
    public @Nullable Class<?> getObjectType() {
        return Car.class;
    }

/**
 * 重写父类或接口中的isSingleton方法
 * 该方法用于判断当前Bean是否为单例模式
 * @return 返回boolean类型值,true表示当前Bean为单例模式,false表示非单例模式
 */
    @Override
    public boolean isSingleton() {
    // 返回true,表示当前Bean是单例模式
    // 在Spring框架中,单例模式表示整个容器中只存在一个该Bean的实例
        return true;
    }
}

实验十二 @Conditionnal条件注册

image.png

image.png

image.png

容器--注入

实验一 @Autowired注解

@Autowired

原理:spring调用getBean方法

自动装配流程:按照类型找到这个组件,有且找到一个,直接返回

如果找到多个,再按照名称去找

实验二 @Qualifer @Primary

image.png

image.png

实验四 @Resource

image.png

@Resource具有更强的通用性

实验六 构造器注入

package com.huawei.springday01ioc.dao;

import com.huawei.springday01ioc.Bean.Dog;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@ToString
@Repository
public class UserDao {


    Dog dog;
@Autowired
public UserDao (Dog dog){

    /**
     *构造器注入
     * /**
     * 依赖注入
     */

    this.dog=dog;

}

public  UserDao (){
 this.dog=null;

}



}

实验五setter方法注入

image.png

理解感知接口

image.png

@Value注解

image.png