SpringIoC&DI

  1. Spring的两大核心:IoC,AOP
    在这里插入图片描述
  2. 五大注解只能加在类上,并且只能加在自己的代码上
    使用五大注解,从五大注解中取对象,得到的对象都是同一个对象
    在这里插入图片描述

@Bean

  1. @Bean可以解决上述问题,@Bean必须搭配五大注解来使用

  2. 使用@Bean注解时,bean的名称是方法名
    五大注解,bean name:
    (1) 首字母大写
    (2) 如果前两个字母都为大写,beanName为类名

  3. 出现的问题:使用类名进行获取bean,有两个方法都是UserInfo的类型,不知道找哪一个了
    所以换一种方法,使用名称进行获取bean
    在这里插入图片描述

在这里插入图片描述
4. 出现上面的有多个bean的时候,就有两种获取userInfo的方法
在这里插入图片描述
IocApplication.java

 // @Bean演示
        UserInfo userInfo = (UserInfo) context.getBean("userInfo");
        System.out.println(userInfo);

        UserInfo userInfo1 = context.getBean("userInfo",UserInfo.class);
        System.out.println(userInfo1);

UserConfig.java

package com.example.ioc.demos.config;

import lombok.Data;

// @Data自动帮我们写了toString方法
@Data
public class UserInfo {
    private Integer id;
    private String name;
    private Integer age;
}

BeanConfig.java

package com.example.ioc.demos.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 跟配置相关的使用@Controller或者是@Component
@Configuration
public class BeanConfig {
    @Bean
    public UserInfo userInfo(){
        UserInfo userInfo = new UserInfo();
        userInfo.setId(1);
        userInfo.setName("张三");
        userInfo.setAge(12);
        return userInfo;
    }

    @Bean
    public UserInfo userInfo1(){
        UserInfo userInfo = new UserInfo();
        userInfo.setId(2);
        userInfo.setName("李四");
        userInfo.setAge(13);
        return userInfo;
    }
}
  1. 如何使用@Bean的时候进行传参??
    在这里插入图片描述
    @Bean传递参数:
    (1) 如果需要的Bean的类型,对应的参数只有一个时,就直接赋值(直接拿那一个相同类型的)
    在这里插入图片描述
    (2) 如果有多个相同类型的参数时,根据名称去匹配
    在这里插入图片描述

  2. SpringBoot特点:约定大于配置,每次创建一个项目,都有一个启动类DemoApplication,默认扫描这个路径下的所有包和类

    在这里插入图片描述
    SpringBoot的扫描路径:
    在这里插入图片描述
    @Bean的应用场景:
    (1) 同样的一个类需要有多个不同对象的时候
    (2) 还有一个就是针对第三方的类,使用注解

加了注解的这些,都使用了单例模式

DI

  1. 比如userService就是依赖,userService也可以认为是UserController的一个属性
  2. DI 依赖注入/属性装配/依赖装配(三种名字是翻译问题)
    在这里插入图片描述
  3. 有三种注入方式:
    属性注入
    构造方法注入
    Setter方法注入

属性注入,构造方法注入,Setter方法注入

  1. 使用@Autowired进行属性注入,构造方法注入,Setter方法注入
    在这里插入图片描述
    在这里插入图片描述

  2. 属性注入存在的问题:
    如果一个类型存在多个对象时,优先名称匹配,如果名称都匹配不上,就会报错
    在这里插入图片描述
    在这里插入图片描述

  3. 属性注入无法注入一个Final修饰的属性
    原因:
    因为属性注入(Field Injection)是通过反射在对象实例化 之后 来设置值的,而 final 字段必须在对象构造的期间(即创建实例时)被初始化。
    (1) 定义时就进行赋值
    (2) 构造方法中进行赋值

  4. 三种注入优缺点分析:
    在这里插入图片描述

  5. 当程序中同一个类型有多个对象时,使用@AutoWired会报错(属性名和需要使用的对象名不一致的情况下)

解决方法:
(1) 属性名和你需要使用的对象名保持一致
(2) 使用@Primary注解标识默认要使用的对象
在这里插入图片描述
(3) 使用@Qualifier,指定使用的对象,这个和第一种方法思路是一样的
使用@Qualifier指定bean
在这里插入图片描述
在这里插入图片描述
(4) 使用@Resource注解
在这里插入图片描述

(3) 和 (4) 使用率比较高

6. 一个经典的面试题:

在这里插入图片描述
7. 存在同一个对象(可以存在多个构造方法),也可以通过@Bean的方式取别名(u1和u2)
在这里插入图片描述
在这里插入图片描述
8. 下面就是重命名Bean的方式:
在这里插入图片描述
属性注入针对的是对象
在Spring中,方法名就是对象

总结

  1. 可以进行端口号的修改

  2. 端口号我们能够使用的范围:0 ~ 65535
    0 ~ 1024 被一些协议所占用,8080被Tomcat所占用,3306被mysql所占用,其它端口号,我们都可以使用
    在这里插入图片描述

  3. 五大注解实现的类是预加载的(先全部加载出这些类)

  4. Bean的存
    在这里插入图片描述
    可以自己对Bean的名称进行命名:
    在这里插入图片描述
    一个Bean可以命名多个名称:
    在这里插入图片描述

  5. Bean的取
    在这里插入图片描述
    6. 常见的面试题:
    在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐