当前位置: 首页 > news >正文

Java SpringIoCDI --- @Bean,DI

文章目录

  • SpringIoC&DI
    • @Bean
    • DI
      • 属性注入,构造方法注入,Setter方法注入
    • 总结

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 {@Beanpublic UserInfo userInfo(){UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setName("张三");userInfo.setAge(12);return userInfo;}@Beanpublic 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) 使用率比较高

6. 一个经典的面试题:

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

总结

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

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

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

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

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

http://www.dtcms.com/a/482772.html

相关文章:

  • 深度学习与舌诊的结合:人工智能助力中医诊断新时代
  • 分治:最大子段和
  • 从江网站建设松江企业网站建设
  • 贪心算法精选30道编程题 (附有图解和源码)
  • 五莲县财源建设网站为什么网站建设图片显示不出来
  • 第11周中间件漏洞
  • 【MySQL】从零开始了解数据库开发 --- 复合查询
  • 解决 Git 推送冲突:使用 Rebase 整合远程更改
  • synchronized锁升级过程详解
  • mit6s081 lab8 locks
  • 建站培训企业管理考研
  • MySQL中的数据类型占用空间和范围
  • Docker部署jenkins集成全自动打包部署
  • 台州自助建站公司做好的网站怎么发布
  • 重磅更新:Claude Code 现在支持插件啦
  • 23种设计模式——访问者模式 (Visitor Pattern)
  • 卧龙区微网站开发网络管理系统怎么打开
  • java用注解优雅校验入参
  • 平台网站建设收费制作网页素材图片
  • 基于OpenCV的实时疲劳检测系统实现
  • HTML5基础——4、表格
  • Docker 通信核心:docker.sock 完全指南
  • Flutter---Button
  • 网站建设需要敲代码吗信息流推广实施策划书
  • 广元网站建设电子商务网站建设主要内容
  • 4.4-中间件之gRPC
  • 网络与通信安全课程复习汇总1——课程导入
  • Qt模型控件:QTreeViewQTreeWidget
  • 河南省城乡建设厅官网廊坊快速优化排名
  • 网站建设应该考虑哪些问题企信宝