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

Spring之@Bean注解

1. 使用方式

1.1 @Configuration + @Bean

1.1.1 创建实体类 User
@Data
@NoArgsConstructor
public class User {private String name;public User(String name) {this.name = name;}
}
1.1.2 创建配置类 UserConfig
@Configuration
public class UserConfig {@Beanpublic User user() {return new User("anna");}
}
1.1.3 创建配置类 AppConfig
@ComponentScan("com.ys")
public class AppConfig {
}
1.1.4 创建启动类 Main
public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);}
}
1.1.5 运行 main 方法,查看运行结果

通过运行结果,得出结论:Spring 容器中存在类型为 User 的 bean 

1.2 接口默认方法

1.2.1 创建实体类 DefaultCarRedCar 以及接口 Car
public class DefaultCar implements Car {
}@Component
public class RedCar implements Car {
}public interface Car {@Beandefault DefaultCar defaultCar() {return new DefaultCar();}
}
1.2.1 运行 main 方法,查看运行结果

通过运行结果,得出结论:Spring 容器中存在类型为 DefaultCar 的 bean

1.3 其他

  • @Bean 标注的方法既可以是实例方法也可以是静态方法
  • 除了 @Configuration + @Bean 的组合使用,原则上 @Component + @Bean、@ManagedBean + @Bean 也是可以的,主要是 full 和 lite 的区别,相关博文:Spring之什么是配置类

2. @Bean 各属性作用

2.1 name、value

指定 beanName ,未指定则为方法名

2.1.1 修改 UserConfig
@Configuration
public class UserConfig {@Bean("anna")public User user() {return new User("anna");}
}
2.1.2 运行 main 方法,查看运行结果

通过运行结果,得出结论:如果指定了 name,则就不存在 beanName 为 user(方法名) 的 bean

2.2 autowire

注入模型(已过期)

2.2.1 修改实体类 User
@Data
@NoArgsConstructor
public class User {private String name;private RedCar redCar;public User(String name) {this.name = name;}}
2.2.2 修改 UserConfig
@Configuration
public class UserConfig {@Bean(name = "anna", autowire = Autowire.BY_TYPE)public User user() {return new User("anna");}
}
2.2.3 运行 main 方法,查看运行结果

通过运行结果,得出结论:User 有个内部属性 redCar,如果注入模式是 byType,即使没有 @Autowired 注解,也会自动注入进去

相关知识点:Spring之注入模型

2.3 autowireCandidate

当注入的依赖存在多个候选者,如果候选者的 autowireCandidate 属性为 false,则不加入候选

2.3.1 修改 UserConfig
@Configuration
public class UserConfig {@Bean(name = "anna", autowireCandidate = false)public User user1() {return new User("anna");}@Bean(name = "bob")public User user2() {return new User("bob");}
}
2.3.2 运行 main 方法,查看运行结果

通过运行结果,得出结论:Spring 容器中一共有两个类型的为 User 的 bean,默认情况下,context.getBean(User.class) 如果找到多个 bean 会抛出异常,但是其中一个 bean 相关的 BeanDefinition 的 autowireCandidate 属性为 false,则表示它不是一个候选者,因此不会抛出异常,只返回 name 为 bob 的 bean

2.4 initMethod、destroyMethod

2.4.1 给实体类 User 添加相关方法
@Data
@NoArgsConstructor
public class User {private String name;private RedCar redCar;public User(String name) {this.name = name;}public void userInit() {System.out.println("user init");}public void userDestroy() {System.out.println("user destroy");}
}
2.4.2 修改 UserConfig
@Configuration
public class UserConfig {@Bean(initMethod = "userInit", destroyMethod = "userDestroy")public User user() {return new User("anna");}}
2.4.3 运行 main 方法,查看运行结果

通过运行结果,得出结论:相应方法会在特定的生命周期执行

3. @Bean和其他注解搭配使用

3.1 @Lazy

3.1.1 修改 UserConfig
@Configuration
public class UserConfig {@Bean@Lazypublic User user() {return new User("anna");}}
3.1.2 运行 main 方法,查看运行结果

通过运行结果,得出结论:在 getBean 方法执行之前一共有 17 个 bean,方法执行之后有 18 个bean,即相关 bean 是懒加载的

3.2 @Primary

3.2.1 修改 UserConfig
@Configuration
public class UserConfig {@Bean@Primarypublic User user1() {return new User("anna");}@Beanpublic User user2() {return new User("bob");}}
3.2.2 运行 main 方法,查看运行结果

通过运行结果,得出结论:@Primary 注解和其 autowireCandidate 属性的功能类似,都是选择最优候选者

3.3 @DependsOn

3.3.1 修改 UserConfig
@Configuration
public class UserConfig {@Bean@DependsOn("user2")public User user1() {return new User("anna");}//    @Bean
//    public User user2() {
//        return new User("bob");
//    }}
3.3.2 运行 main 方法,查看运行结果

通过运行结果,得出结论:Spring 容器中必须存在指定 names 的 bean,否则会抛出异常

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL 如何保证事务的原子性
  • 考完PMP最好的出路!是做项目管理培训讲师!
  • Unity转Unreal5从入门到精通之UMG的使用
  • 网安新声 | 从微软“狂躁许可”漏洞事件看安全新挑战与应对策略
  • STM32后备区域:读写BKP备份寄存器与使用RTC实时时钟详解
  • 倒计时:隐藏删除按钮,点击添加按钮最多显示删除按钮10秒自动隐藏
  • Node.js 文件系统
  • 数据结构与算法——平衡二叉树
  • C++竞赛初阶L1-13-第五单元-循环嵌套(29~30课)536: T456455 画矩形
  • 前向传播与反向传播
  • 【Redis】Redis线程与IO模型—(三)
  • Docker最佳实践进阶(二):Docker Compose部署SpringCloud微服务项目
  • ansible环境搭建
  • 免费开源的AI绘画工具ComfyUI,让AI作画变得简单又快捷
  • EmguCV学习笔记 VB.Net和C# 下的OpenCv开发 C# 目录
  • [deviceone开发]-do_Webview的基本示例
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Angular4 模板式表单用法以及验证
  • HTTP中的ETag在移动客户端的应用
  • PHP CLI应用的调试原理
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Shell编程
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 使用 @font-face
  • 我的面试准备过程--容器(更新中)
  • 小程序button引导用户授权
  • 应用生命周期终极 DevOps 工具包
  • 走向全栈之MongoDB的使用
  • ​如何使用QGIS制作三维建筑
  • #14vue3生成表单并跳转到外部地址的方式
  • #Linux(Source Insight安装及工程建立)
  • (1)Hilt的基本概念和使用
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (pojstep1.3.1)1017(构造法模拟)
  • (zhuan) 一些RL的文献(及笔记)
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (译)2019年前端性能优化清单 — 下篇
  • (转)【Hibernate总结系列】使用举例
  • (转)程序员技术练级攻略
  • .aanva
  • .Net - 类的介绍
  • .NET 8.0 发布到 IIS
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Micro Framework初体验
  • .Net 高效开发之不可错过的实用工具
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .net和php怎么连接,php和apache之间如何连接
  • .NET精简框架的“无法找到资源程序集”异常释疑