起因:经常在Config文件里看见Bean的存在,所以开始探究Bean的概念还使用方法。
原文来自:https://gustavopeiretti.com/spring-boot-bean-annotation/#:~:text=What%20is%20%40Configuration%20in%20Spring,other%20parts%20of%20the%20application.
在Spring Boot中,@Bean是一个方法级注解,用于声明一个Bean并将其注册到Spring容器。
什么是Spring Boot中的@Configuration?
在Spring Boot中,@Configuration注解用来表示一个类包含一个或多个Bean定义。
Bean是一个由Spring框架管理的object,可用于向应用程序的其他部分提供服务或功能。
当一个类被@Configuration注解时,它被视为Bean定义的来源,而该类中任何被@Bean注解的方法都将被用来创建和配置Bean。
What is a Bean in Spring Boot?
Bean是一个由Spring框架管理的object。
它是由Spring容器创建和管理的,Bean可以用来封装并向应用程序中的其他组件提供服务、实用程序和功能。
@Bean是一个annotation,用于将一个方法声明为Bean,因此,要在Spring Boot中创建一个Bean,你只需用@Bean来注解一个方法。
该方法应该返回一个你想在Spring容器中注册为Bean的对象。然后,Spring容器将管理Bean的生命周期,并根据需要将其注入其他组件中。
下面是一个如何使用@Bean注解在Spring Boot中定义Bean的例子。请注意,这个类是用@Configuration注解的,所以,我们可以在那里创建@Bean。
@Configuration public class AppConfig { @Bean public MultiplierService multiplier() { return new MultiplierService(2); } }
在这个例子中,MultiplierService是一个提供其他组件可能使用的一些服务的类。multiplier()方法被注解为@Bean,这告诉Spring把它当作一个Bean。当Spring容器启动时,它将调用这个方法来创建一个新的MultiplierService的实例(instance)。这个实例将由Spring管理,并可以被注入到其他依赖它的组件中。
请注意,@Bean注解是在@Configuration类中使用的,这是一种特殊类型的Spring组件,定义了应用程序的配置信息。
This is de MultiplierService class that we want to add like a Bean in our Configuration.
public class MultiplierService { private final int multiplier; public MultiplierService(int multiplier) { this.multiplier = multiplier; } public int multiply(int value) { return value * multiplier; } }
How to use a Bean we have created
你可以通过自动连接到另一个类或组件来使用你所创建的Bean。
下面是一个将 "MultiplierService "bean自动连接到我们的 "AppService "的例子:
@Service public class AppService { private final MultiplierService multiplierService; public AppService(@Autowired MultiplierService multiplierService) { this.multiplierService = multiplierService; } public int calculate(int aValue) { return multiplierService.multiply(aValue); } }
注意:实际上可以省略@Autowired,因为到目前为止我们只有一个定义的Bean,而且如果@Autowired不存在,Spring会寻找一个满足构造函数的Bean。
How to give a name to a Bean
可以通过为@Bean注解提供一个名字来给Bean命名。这将被用作Spring容器中Bean的名称。
@Bean(name= "multiplierService") public MultiplierService multiplier() { return new MultiplierService(2); }
How to call a Bean by its name?
在Spring Boot中,可以使用@Qualifier注解来调用具有特定名称的Bean。
当有多个相同类型的Bean时,或者只是当我们想特别声明要使用的Bean时,@Qualifier注解被用来指定要使用的Bean的名字。
@Service public class AppService { private final MultiplierService multiplierService; public AppService(@Autowired @Qualifier("multiplierService") MultiplierService multiplierService) { this.multiplierService = multiplierService; } public int calculate(int aValue) { return multiplierService.multiply(aValue); } }
What is the cycle of life of the @Bean
在这个例子中,@Bean方法被定义在一个@Configuration类中。
1- 然后Bean定义被注册到Spring容器中,容器对Bean进行实例化和初始化
2- Spring注入Bean所需的任何依赖关系。
3- Init method is called.。
3- 一旦Bean被完全初始化,它就可以在应用程序中使用了。
4- 当应用程序关闭或Bean被容器销毁时,@Bean注解中指定的任何destroy方法将被调用。
ConditionalOnProperty annotation with Spring ‘Beans’
@ConditionalOnProperty
annotation is used to conditionally create a Spring bean depending on the configuration of a property.
@ConditionalOnProperty(name = "sender.sms", havingValue = "true") @Bean(name = "senderMessagesSms") public SenderMessages senderMessagesSms() { return new SenderMessagesSms(); } @ConditionalOnProperty(name = "sender.sms", havingValue = "false") @Bean(name = "senderMessagesEmail") public SenderMessages senderMessagesEmail() { return new SenderMessagesEmail(); }
总结
这是对我们所讲内容的总结:
在Spring Boot中,@Bean是一个方法级注解,用于声明一个Bean并将其注册到Spring容器中。
@Bean方法必须在@Configuration类中定义,它通常会返回一个你想在应用中作为Bean使用的类的实例。
你可以选择使用@Bean注解的name属性为Bean指定一个名字。
你还可以使用@Bean注解的value属性为Bean指定一个别名数组。
你可以使用依赖性注入将一个@Bean注入到另一个类或组件中,这样你就可以在你的应用程序中使用该Bean。
你可以使用@Bean注解的initMethod和destroyMethod属性来指定当Bean被实例化和销毁时要调用的方法。
Spring Boot中@Bean的生命周期包括注册、实例化和初始化、依赖注入和最终销毁。
如果你需要在某些条件下创建一个Bean,请使用ConditionalOnProperty注解。
总之,@Bean是Spring Boot中一个强大的注解,它允许你以直接和直观的方式来声明Bean。你可以通过在你的@Configuration类中创建@Bean方法,在你的应用程序中注册和使用你的类的实例作为Bean,你可以使用Spring的依赖注入架构来有效地管理你的组件的依赖关系。