Java SpringIoC&DI --- @Bean,DI

文章目录

SpringIoC&DI

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

@Bean

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

  2. 使用@Bean注解时,bean的名称是方法名

    五大注解,bean name:

    (1) 首字母大写

    (2) 如果前两个字母都为大写,beanName为类名

  3. 出现的问题:使用类名进行获取bean,有两个方法都是UserInfo的类型,不知道找哪一个了

    所以换一种方法,使用名称进行获取bean

  1. 出现上面的有多个bean的时候,就有两种获取userInfo的方法

IocApplication.java

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

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

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修饰的属性

    原因:

    (1) 定义时就进行赋值

    (2) 构造方法中进行赋值

  4. 三种注入优缺点分析:

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

解决方法:

(1) 属性名和你需要使用的对象名保持一致

(2) 使用@Primary注解标识默认要使用的对象

(3) 使用@Qualifier,指定使用的对象,这个和第一种方法思路是一样的

使用@Qualifier指定bean

(4) 使用@Resource注解

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

  1. 一个经典的面试题:
  1. 存在同一个对象(可以存在多个构造方法),也可以通过@Bean的方式取别名(u1和u2)

  2. 下面就是重命名Bean的方式:

属性注入针对的是对象

总结

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

  2. 端口号我们能够使用的范围:0 ~ 65535

    0 ~ 1024 被一些协议所占用,8080被Tomcat所占用,3306被mysql所占用,其它端口号,我们都可以使用

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

  4. Bean的存

    可以自己对Bean的名称进行命名:

    一个Bean可以命名多个名称:

  5. Bean的取

    6. 常见的面试题:

相关推荐
史迪奇_xxx4 小时前
9、C/C++ 内存管理详解:从基础到面试题
java·c语言·c++
88号技师4 小时前
【2025年10月一区SCI】改进策略:Trend-Aware Mechanism 趋势感知机制(TAM)-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
hweiyu004 小时前
Spring Boot 项目集成 Gradle:构建、测试、打包全流程教程
java·spring boot·后端·gradle
晨非辰4 小时前
《超越单链表的局限:双链表“哨兵位”设计模式,如何让边界处理代码既优雅又健壮?》
c语言·开发语言·数据结构·c++·算法·面试
胖咕噜的稞达鸭4 小时前
算法入门:专题攻克一---双指针4(三数之和,四数之和)强推好题,极其锻炼算法思维
开发语言·c++·算法
一勺菠萝丶4 小时前
Spring Boot 项目启动报错:`Could not resolve type id ... no such class found` 终极解决方案!
java·spring boot·后端
聪明的笨猪猪4 小时前
Java Redis “底层结构” 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
Chris.Yuan7704 小时前
泛型学习——看透通配符?与PECS 法则
java·学习