@Bean 注解方法时,参数自主选择注入的bean

本文深入解析了Spring框架中@Bean注解的使用方法及其参数自动注入的原理,详细介绍了@Autowrite、@Primary和@Qualifier等注解的作用,并探讨了同类型Bean出现的场景。

众所周知
当@Bean 注解使用在方法上面是,会被spring自动作为一个bean进行注入,
bean的类型为该方法的返回类型,
bean的id为方法名称
方法参数,会通过spring自动注入

问题是:
方法参数的自动注入原理

@Component
public class Test{
	@Bean
	public MyBean mytest(){
		return new MyBean();
	}
	@Bean
	public MyBean mytest2(){
		return new MyBean();
	}

	@Bean
	public MyBeanTest MyBeanTest(@Qualifier(value="mytest") Mybean mytest){
		return MyBeanTest (mytest);
	}
	@Bean
	public MyBeanTest MyBeanTest2(@Qualifier(value="mytest2") Mybean mytest){
		return MyBeanTest (mytest);
	}
}

public Class MyBean{
}

public Class MyBeanTest{
}

从上述例子中可以看出使用@Bean 注解方法时,参数 是通过 @Autowrited 注解方式,进行自动注入的,所以可以适用任何@Autowrited配合适用的任意注解。

扩展:
@Autowite 配套使用的注解

1、@Primary
该注解指定 当存在多个同类型的bean时,具有当前注解的bean会被作为首选

2、@Qualifier
该注解指定 当存在多个同类型的bean时,通过其配置的value值,选择对应ID的Bean

再扩展:
什么时候会出现同类型的bean
1、当两个类实现同一个接口时,若同时将这两个类声明成spring中的bean这时候,两个bean的类型就相同
2、当使用@bean注解方法时,两个方法具有相同的返回类型是,生成的两个bean就是同类型的。

### 如何通过 @Configuration 和 @Bean 注解定义的 Bean 进行方法调用 在 Spring 中,使用 `@Configuration` 和 `@Bean` 注解可以替代传统的 XML 配置文件来定义和管理 Bean。通过这种方式定义的 Bean 可以被注入到其他组件中,并且可以通过依赖注入的方式调用其方法。 以下是一个完整的示例代码,展示如何通过 `@Configuration` 和 `@Bean` 注解定义 Bean 并调用其方法: ```java // 定义一个简单的类作为 Bean public class Person { private String name; private String id; public Person(String id, String name) { this.id = id; this.name = name; } // 提供一个方法用于调用 public void sayHello() { System.out.println("Hello, my name is " + name + " and my ID is " + id); } } // 使用 @Configuration 注解定义配置类 @Configuration public class BeanConfig { // 使用 @Bean 注解定义一个 Bean @Bean public Person personBean() { return new Person("12345", "John Doe"); } } // 主类用于测试 public class MainApp { public static void main(String[] args) { // 创建 AnnotationConfigApplicationContext 容器 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanConfig.class); // 从容器中获取 Bean Person person = context.getBean(Person.class); // 调用 Bean方法 person.sayHello(); // 关闭上下文 context.close(); } } ``` #### 示例解析 1. **定义 Bean 类**:创建了一个名为 `Person` 的类,并提供了一个 `sayHello` 方法[^1]。 2. **配置类**:使用 `@Configuration` 注解标记的 `BeanConfig` 类作为配置类,在其中使用 `@Bean` 注解方法返回一个 `Person` 实例[^3]。 3. **获取 Bean 并调用方法**:通过 `AnnotationConfigApplicationContext` 加载配置类,从容器中获取 `Person` Bean,并调用其 `sayHello` 方法[^4]。 ### 注意事项 - 如果未通过 `@Bean` 指定 Bean 的名称,则默认与标注的方法名相同。例如,上述代码中 `personBean` 方法对应的 Bean 名称为 `personBean`[^2]。 - 默认情况下,`@Bean` 注解Bean 是单例作用域(singleton)。如果需要原型作用域(prototype),可以通过 `@Scope("prototype")` 设置[^2]。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值