⽅法注解 @Bean

类注解是添加到某个类上的,但是存在两个问题:

  1. 使⽤外部包⾥的类,没办法添加类注解

  2. ⼀个类,需要多个对象,⽐如多个数据源

这种场景,我们就需要使⽤⽅法注解@Bean

我们先来看看⽅法注解如何使⽤:

java 复制代码
public class BeanConfig {
 @Bean
 public User user(){
 User user = new User();
 user.setName("zhangsan");
 user.setAge(18);
 return user;
 }
}

然⽽,当我们写完以上代码,尝试获取bean对象中的user时却发现,根本获取不到:

java 复制代码
@SpringBootApplication
public class SpringIocDemoApplication {
 public static void main(String[] args) {
 //获取Spring上下⽂对象 
 ApplicationContext context = 
SpringApplication.run(SpringIocDemoApplication.class, args);
 //从Spring上下⽂中获取对象 
 User user = context.getBean(User.class);
 //使⽤对象 
 System.out.println(user);
 }
}

以上程序的执⾏结果如下:

这是为什么呢?

1 ⽅法注解要配合类注解使⽤

在Spring框架的设计中,⽅法注解 @Bean 要配合类注解才能将对象正常的存储到Spring容器中, 如下代码所⽰:

java 复制代码
@Component
public class BeanConfig {
 @Bean
 public User user(){
 User user = new User();
 user.setName("zhangsan");
 user.setAge(18);
 return user;
 }
}

再次执⾏以上代码,运⾏结果如下:

2 定义多个对象

对于同⼀个类,如何定义多个对象呢?

⽐如多数据源的场景,类是同⼀个,但是配置不同,指向不同的数据源.

我们看下@Bean的使⽤

java 复制代码
@Component
public class BeanConfig {
 @Bean
 public User user1(){
 User user = new User();
 user.setName("zhangsan");
 user.setAge(18);
 return user;
 }
 @Bean
 public User user2(){
 User user = new User();
 user.setName("lisi");
 user.setAge(19);
 return user;
 }
}

定义了多个对象的话,我们根据类型获取对象,获取的是哪个对象呢?

java 复制代码
@SpringBootApplication
public class SpringIocDemoApplication {
 public static void main(String[] args) {
 //获取Spring上下⽂对象 
 ApplicationContext context = 
SpringApplication.run(SpringIocDemoApplication.class, args);
 //从Spring上下⽂中获取对象 
 User user = context.getBean(User.class);
 //使⽤对象 
 System.out.println(user);
 }
}

运⾏结果:

报错信息显⽰:期望只有⼀个匹配,结果发现了两个,user1,user2

从报错信息中,可以看出来, @Bean注解的bean,bean的名称就是它的⽅法名

接下来我们根据名称来获取bean对象

java 复制代码
@SpringBootApplication
public class SpringIocDemoApplication {
 public static void main(String[] args) {
 //获取Spring上下⽂对象 
 ApplicationContext context = 
SpringApplication.run(SpringIocDemoApplication.class, args);
 //根据bean名称, 从Spring上下⽂中获取对象 
 User user1 = (User) context.getBean("user1");
 User user2 = (User) context.getBean("user2");
 System.out.println(user1);
 System.out.println(user2);
 }
}

运⾏结果:

可以看到,@Bean可以针对同⼀个类,定义多个对象.

3 重命名 Bean

可以通过设置name属性给Bean对象进⾏重命名操作,如下代码所⽰:

java 复制代码
@Bean(name = {"u1","user1"})
public User user1(){
 User user = new User();
 user.setName("zhangsan");
 user.setAge(18);
 return user;
}

此时我们使⽤u1就可以获取到User对象了,如下代码所⽰:

java 复制代码
@SpringBootApplication
public class SpringIocDemoApplication {
 public static void main(String[] args) {
 //获取Spring上下⽂对象 
 ApplicationContext context = 
SpringApplication.run(SpringIocDemoApplication.class, args);
 //从Spring上下⽂中获取对象 
 User u1 = (User) context.getBean("u1");
 //使⽤对象 
 System.out.println(u1);
 }

name={}可以省略,如下代码所⽰:

java 复制代码
@Bean({"u1","user1"})
public User user1(){
 User user = new User();
 user.setName("zhangsan");
 user.setAge(18);
 return user;
}

只有⼀个名称时,{}也可以省略,如:

java 复制代码
@Bean("u1")
public User user1(){
 User user = new User();
 user.setName("zhangsan");
 user.setAge(18);
 return user;
}
相关推荐
橘子海全栈攻城狮31 分钟前
【最新源码】基于SpringBoot + Vue的超市管理系统的设计与实现D002
java·开发语言·vue.js·spring boot·后端·spring
smartvxworks37 分钟前
Linux 实时内核(Linux Real-Time Kernel)详解:原理、实践与优化
java·linux·服务器
qizayaoshuap38 分钟前
# [特殊字符] 密码生成器 — 鸿蒙ArkTS安全算法与密码强度评估系统
java·算法·安全·华为·harmonyos
AC赳赳老秦40 分钟前
OpenClaw 采集任务日志审计:全程记录采集行为,满足合规溯源与企业审计要求
java·大数据·python·数据挖掘·数据分析·php·openclaw
空中湖41 分钟前
Spring AI Function Calling 完全指南:让 AI 查数据库、调 API、发通知
数据库·人工智能·spring
风起洛阳@不良使1 小时前
spring中xml和注解开发的对比
xml·java·spring
Tenifs1 小时前
关闭 IDEA 的英文单词拼写检查
java·intellij-idea
captain3761 小时前
创建多线程程序
java·java-ee
野蛮人6号1 小时前
黑马天机学堂Day01-08.搭建项目环境-本地开发部署方式——不知道nacos的密码是什么
java·spring cloud·黑马程序员·天机学堂·黑马天机学堂
Roy_Sashulin1 小时前
灵杉Java编程平台第一章:安装
java·开发语言