专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java 面试题:Spring 配置 Bean 实例化有哪些方式?

temp10 2025-07-28 20:13:37 java教程 2 ℃ 0 评论

pring 配置 Bean 实例化的方式主要有以下几种,每种方式适用于不同场景,理解其核心原理和差异是面试中的关键加分项:


一、基于 XML 配置(经典方式)

1.构造器实例化

通过默认无参构造器创建 Bean(最常用)

Java 面试题:Spring 配置 Bean 实例化有哪些方式?

xml

<bean id="userService" class="com.example.UserServiceImpl"/>

2.静态工厂方法

通过静态方法返回 Bean 实例

java

public class BeanFactory {
    public static UserService createUserService() {
        return new UserServiceImpl();
    }
}

xml

<bean id="userService" class="com.example.BeanFactory" factory-method="createUserService"/>

3.实例工厂方法

先创建工厂 Bean,再通过其非静态方法生成目标 Bean

xml

<bean id="beanFactory" class="com.example.BeanFactory"/>
<bean id="userService" factory-bean="beanFactory" factory-method="createUserService"/>

二、基于注解配置(现代主流)

1.@Component及其衍生注解

  • @Component:通用组件
  • @Service:业务层
  • @Repository:持久层
  • @Controller:控制层

java

@Service // 等价于 <bean id="userService" class="...">
public class UserServiceImpl implements UserService {}

2.@Bean注解(Java Config 核心)

在配置类中显式声明 Bean,适用于第三方库或复杂初始化

java

@Configuration
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        return new DruidDataSource(); // 可自定义配置参数
    }
}

3.@Import注解

快速导入其他配置类或普通类(自动注册为 Bean)

java

@Configuration
@Import({DatabaseConfig.class, SecurityConfig.class}) 
public class MainConfig {}

三、高级扩展方式

1.FactoryBean接口

实现 FactoryBean<T> 接口定制复杂对象的创建逻辑(如 MyBatis 的 SqlSessionFactoryBean)

java

public class MyFactoryBean implements FactoryBean<UserService> {
    @Override
    public UserService getObject() {
        return new UserServiceProxy(); // 返回代理对象
    }
}

xml

<bean id="userService" class="com.example.MyFactoryBean"/>

2.@Conditional条件装配

根据条件动态决定是否创建 Bean(Spring Boot 核心机制)

java

@Bean
@ConditionalOnClass(DataSource.class) // 当类路径存在 DataSource 时生效
public DataSource dataSource() { ... }

3.ImportBeanDefinitionRegistrar动态注册

编程式控制 Bean 的注册过程(框架级扩展常用)

java

public class MyRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(...) {
        registry.registerBeanDefinition("customBean", new RootBeanDefinition(CustomBean.class));
    }
}

四、特殊场景实例化

1.通过Supplier接口(Spring 5.0+)

java

GenericApplicationContext context = new GenericApplicationContext();
context.registerBean("userService", UserService.class, UserServiceImpl::new);

2.@Scope控制作用域

指定 Bean 的生命周期(如原型模式每次创建新实例)

java

@Bean
@Scope("prototype")
public UserService userService() { ... }

面试回答技巧

  1. 分类清晰:按 XML/注解/扩展机制分层说明
  2. 突出重点:强调 @Component 和 @Bean 是现代开发的主流选择
  3. 场景举例
  4. 普通业务类 → @Service
  5. 整合第三方库 → @Bean
  6. 动态代理 → FactoryBean

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表