Spring 装配 Bean 的几种方式

本文详细介绍Spring框架中使用Java配置类装配Bean的三种方法:直接创建、工厂方式及混合方式。通过具体代码实例,展示如何创建和使用Bean实体类,以及如何在配置类中通过不同方法装配这些Bean。

Spring 有多种装配 bean 的方式,最初学习的应该是在 xml 配置文件中装配 bean,而实际项目中最常用的当然是简单方便的自动扫描方式了。本文主要是记录一下通过 .java 配置类装配 bean 的三种方式。

直接创建
  • 创建 Bean1 实体类(可以不要内容,空类即可)
  • 配置文件中通过 createBean() 方法装配(创建) bean1
  • 测试类获取 bean1
工厂方式
  • 创建 Bean2 实体类(空类即可)
  • 创建 Bean2Factory 工厂类,实现 FactoryBean 接口
  • 配置文件中通过 createFactoryBean() 方法装配 bean2
  • 测试类获取 bean2
  • 测试类获取工厂 bean
混合方式
  • 创建 Bean3 实体类(空类即可)
  • 创建 Bean3Factory 工厂类
  • 配置文件中先通过 Bean3Factory() 方法装配工厂 bean,再通过 createBean3() 方法获取工厂 bean 作为参数装配 bean3
  • 测试类获取 bean3,这里获取工厂 bean 的方式则跟直接装配是一样的

ps:这三种方式的名字是自己这么叫的,如不恰当请结合代码理解

总体代码如下:
1、实体类 Bean1,Bean2,Bean3 都是空类

public class Bean1 {

}

2、Bean2Factory 工厂类

import org.springframework.beans.factory.FactoryBean;

public class Bean2Factory implements FactoryBean<Bean2> {

	@Override
	public Bean2 getObject() throws Exception {
		return new Bean2();
	}

	@Override
	public Class<?> getObjectType() {
		return Bean2.class;
	}
	//是否是单例,默认true
	public boolean isSingleton() {
		return false;
	}
}

3、Bean3Factory 工厂类


//不实现接口
public class Bean3Factory {
	public Bean3 createBean() {
		return new Bean3();
	}
}

4、配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class MyConfig {
	@Bean(name = "myBean1")
	@Scope("prototype")  //默认单例,改成多例
	public Bean1 createBean() {
		return new Bean1();
	}
	//-----------------------------------------------
	@Bean
	public Bean2Factory createFactoryBean() {
		return new Bean2Factory();
	}
	//-----------------------------------------------
	@Bean
	public Bean3Factory Bean3Factory() {
		return new Bean3Factory();
	}
	
	@Bean
	public Bean3 createBean3(Bean3Factory bean3Factory) {
		return bean3Factory.createBean();
	}
	
}

5、测试类,获取 bean

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {
	public static void main( String[] args ) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        System.out.println(context.getBean(Bean1.class));
        // 按bean的名字获取,未命名时默认为方法名,已命名则根据已命好的名字,并且不能用方法名获取该bean了
//        System.out.println(context.getBean("createBean"));
        System.out.println(context.getBean("myBean1"));
        
        //通过 MyBeanFactory 工厂获取 bean2
        System.out.println(context.getBean(Bean2.class));
        System.out.println(context.getBean("createFactoryBean"));
        //获取 MyBeanFactory 工厂本身这个 bean
        System.out.println(context.getBean(Bean2Factory.class));
        System.out.println(context.getBean("&createFactoryBean"));
        
        System.out.println(context.getBean(Bean3.class));
        System.out.println(context.getBean("createBean3"));
        System.out.println(context.getBean(Bean3Factory.class));
        System.out.println(context.getBean("Bean3Factory"));
        
        context.close();
    }
}
<think>好的,我现在需要回答用户关于Spring框架中不同Bean装配方式的问题。用户希望了解具体的装配方法,并给出示例。首先,我得回忆一下SpringBean装配几种主要方式:XML配置、Java注解配置和Java配置类。此外,可能还有自动装配和条件化装配,这些也是常见的。 根据用户提供的引用资料,特别是引用[2]和[3],提到了XML配置、Java配置和注解配置的转换过程,以及通过setter方法进行属性注入的要求。引用[3]还提到实例化Bean时默认使用无参构造方法,然后通过反射调用setter方法注入属性。引用[4]则补充了自动装配方式,比如使用ref参数和setter方法。 接下来,我需要将这些信息整理成结构清晰的回答,每种装配方式都需要有示例代码。比如XML配置的话,需要展示<bean>标签的使用,构造器注入和setter注入的区别。注解配置方面,@Component和@Autowired的使用是重点。Java配置类则需要展示@Configuration和@Bean的用法。自动装配和条件化装配可能属于更高级的内容,但用户的问题提到了不同的方式,所以应该包括进去。 在整理过程中,要确保每个示例的代码正确,并符合用户要求的格式,比如代码块用反引号包裹,注明语言类型。同时,需要引用提供的参考资料,比如在提到setter注入时引用[3],自动装配时引用[4],条件化装配时引用[1]。 还需要注意用户提到的系统级指令,比如数学公式的格式,但这里可能用不上。另外,生成相关问题部分需要根据回答内容提出,比如不同装配方式的优缺点、如何选择等。 最后,检查所有引用是否正确标注,示例代码是否正确,语言是否通顺,符合中文回答的要求。确保没有遗漏任何主要的装配方式,并且每种方式都有清晰的示例说明。</think>### Spring框架中的Bean装配方式示例 #### 1. **XML配置方式** 通过XML文件定义Bean及其依赖关系,支持构造器注入和属性注入。 ```xml <!-- 构造器注入 --> <bean id="userService" class="com.example.UserService"> <constructor-arg ref="userRepository"/> <!-- 引用其他Bean --> </bean> <!-- 属性注入(需提供setter方法) --> <bean id="userRepository" class="com.example.UserRepository"> <property name="dataSource" ref="dataSource"/> <!-- 依赖注入 --> </bean> ``` - **构造器注入**要求类有对应参数的构造方法。 - **属性注入**需提供无参构造方法和属性的setter方法[^3]。 --- #### 2. **注解配置方式** 使用`@Component`、`@Autowired`等注解实现自动装配。 ```java @Component("userService") // 声明为Bean public class UserService { @Autowired // 自动注入依赖 private UserRepository userRepository; } @Component public class UserRepository { @Autowired private DataSource dataSource; } ``` - 需在XML中开启组件扫描:`<context:component-scan base-package="com.example"/>`。 - `@Autowired`默认按类型匹配,结合`@Qualifier`可按名称匹配[^2][^4]。 --- #### 3. **Java配置类方式** 通过`@Configuration`和`@Bean`以编程方式定义Bean。 ```java @Configuration public class AppConfig { @Bean // 定义Bean public UserRepository userRepository() { return new UserRepository(dataSource()); } @Bean public DataSource dataSource() { return new HikariDataSource(); // 返回具体实现 } } ``` - 替代XML配置,适合需要动态初始化的场景。 --- #### 4. **自动装配方式** Spring通过`@Autowired`或XML的`autowire`属性自动解析依赖。 ```xml <bean id="userService" class="com.example.UserService" autowire="byType"/> ``` - `byType`:按类型匹配依赖的Bean。 - `byName`:按属性名与Bean名匹配。 --- #### 5. **条件化装配** 结合`@Conditional`注解实现条件化Bean创建。 ```java @Bean @Conditional(DataSourceExistsCondition.class) // 自定义条件 public DataSource dataSource() { return new EmbeddedDatabaseBuilder().build(); } ``` - 需实现`Condition`接口定义条件逻辑[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值