Spring装配bean之通过 Java 代码装配 bean
github:https://github.com/guo1727013939/SpringBean
在Spring中,对象无需自己查找和创建与其所关联的其他对象。相反,容易负责把需要相互协作的对象引用赋予各个对象。例如,一个订单管理的组件需要信用卡认证组件,但它不需要自己创建信用卡认证组件。订单管理组件只需要表明自己两手空空,容器就会主动赋予它一个信用卡认证组件。创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入(DI)的本质。
Spring容器负责创建应用程序的bean并通过DI来协调这些对象之间的关系。但是,作为开发人员,你需要告诉Spring要创建那些bean并且如何将其装配在一起。当描述bean如何进行装配时,Spring具有非常大的灵活性,它提供了三种主要的装配机制:
- 在XML中进行显式配置;
- 在Java中进行显式配置;
- 隐式的bean发现机制和自动装配;
1.通过 Java 代码装配 bean
尽管在很多场景下通过组件扫描和自动装配实现 Spring 的自动化配置是更为推荐的方式,但有时候自动化配置的方案行不通,因此需要明确配置 Spring。比如说,你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加 @Component 和 @Autowired 注解的,因此就不能使用自动化装配的方案了。
package soundsystem;
import org.springframework.beans.factory.annotation.Configurable;
/**
* @author 国洪志
* @description
* @since 2022-08-22 10:49
**/
@Configurable
public class CdPlayerConfig {
}
2声明简单的bean
package soundsystem;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
/**
* @author 国洪志
* @description
* @since 2022-08-22 10:49
**/
@Configurable
public class CdPlayerConfig {
/**
* @Bean 注解会告诉Spring这个方法将会返回一个对象,对该对象要注册为Spring应用上下文的Bean。
* 默认情况下,bean的ID与带有@Bean注解的方法名是一样的。 可以使用@Bean的name属性进行重命名
*/
@Bean
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}
}
发挥想象力,我们希望可以做一点稍微疯狂的事情,比如说在一组CD中随机选择一个CompactDisc来播放
package soundsystem;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
/**
* @author 国洪志
* @description
* @since 2022-08-22 10:49
**/
@Configurable
public class CdPlayerConfig {
/**
* @Bean 注解会告诉Spring这个方法将会返回一个对象,对该对象要注册为Spring应用上下文的Bean。
* 默认情况下,bean的ID与带有@Bean注解的方法名是一样的。 可以使用@Bean的name属性进行重命名
*/
@Bean
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}
@Bean
public CompactDisc randomBeatlesCD(){
int choice = (int)Math.floor(Math.random() * 4);
if (choice == 0){
return new SgtPeppers();
}else if (choice == 1){
return new SgtPeppers();//另一张CD
}else if (choice == 2){
return new SgtPeppers();//另一张CD
}else{
return new SgtPeppers();//另一张CD
}
}
}
3 借助JavaConfig实现注入
我们前面所声明的CompactDisc bean是非常简单的,它自身没有其他的以来。但现在我们需要声明CDPlayer Bean,它依赖于CompactDisc。在JavaConfig中,要如何将它们装配到在一起呢?
package soundsystem;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
* @author 国洪志
* @description
* @since 2022-08-22 10:49
**/
@Configurable
public class CdPlayerConfig {
/**
* @Bean 注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文的Bean。
* 默认情况下,bean的ID与带有@Bean注解的方法名是一样的。 可以使用@Bean的name属性进行重命名
*/
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}
@Bean
public CompactDisc randomBeatlesCD(){
int choice = (int)Math.floor(Math.random() * 4);
if (choice == 0){
return new SgtPeppers();
}else if (choice == 1){
return new SgtPeppers();
}else if (choice == 2){
return new SgtPeppers();
}else{
return new SgtPeppers();
}
}
/**
* 默认情况下Spring中的Bean都是单例的,我们并没有必要创建相同的Bean
*
* 我们这使用CDPlayer的构造器实现了DI功能,但是我们完全可以采用其他风格的DI配置
*
* 带有@Bean注解的方法可以采用任何必要的方式来产生bean实例
*
*/
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(sgtPeppers());
}
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc){
return new CDPlayer(compactDisc);
}
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc){
CDPlayer cdPlayer = new CDPlayer(compactDisc);
cdPlayer.setCd(compactDisc);
return cdPlayer;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!