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. 常见的面试题:

相关推荐
Dovis(誓平步青云)几秒前
启元 T1 Pro 人机相声搭档:语音-触摸双通道的启元机器人节奏引擎设计
开发语言·前端·javascript·microsoft·交互
做科研的周师兄3 分钟前
【R语言实战】MixSIAR 氢氧同位素水源解析全流程:从混合空间校验到贝叶斯 MCMC 收敛诊断(后附完整代码)
java·大数据·开发语言
有点小困97713 分钟前
Spring Boot 异步任务 ClassLoader 踩坑实录:ClassNotFoundException 的诡异真相
java
aiks_yuan16 分钟前
Java 正则表达式很慢怎么办:Pattern 预编译只快 2~5 倍,真正卡死线程的是回溯(JDK 8、11、17 实测)
java
用户37215742613518 分钟前
C# 填写 PDF 交互式表单:文本框、复选框、单选按钮和下拉列表
java
IT枫斗者枫哥21 分钟前
Java 退款请求超时,先查原单还是重试?
java·后端
特立独行的猫A25 分钟前
我用仓颉写了个多平台发文工具:一份 Markdown,一条命令发六个平台
java·后端·python
ikgy38 分钟前
JAVA EE:1.计算机是如何工作的
java·java-ee
.痞老板.1 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee
奇树谦1 小时前
Qt Quick 图片加载与 GPU 纹理机制详解:QImage、QQuickTextureFactory、QSGTexture 与异步加载
开发语言·qt·系统架构