spring有关bean的依赖注入、bean注入容器、实例化bean

发布时间 2023-08-06 17:35:04作者: 一个苦逼的23届毕业生

这是一个非常容易搞混的面试题,要清除问的是什么,不然回答再好也寄了

Spring中的Bean实例化方式

1.构造函数实例化:通过构造函数创建Bean的实例。在XML配置文件或者Java配置类中指定Bean的构造函数参数,Spring容器会根据配置使用相应的构造函数来实例化Bean。
XML配置方式:

<bean id="myBean" class="com.example.MyBeanClass">
    <constructor-arg value="argumentValue" />
</bean>

Java配置方式:

@Configuration
public class AppConfig {
    @Bean
    public MyBeanClass myBean() {
        return new MyBeanClass("argumentValue");
    }
}

2.静态工厂方法实例化:通过调用Bean类的静态工厂方法来创建Bean的实例。
XML配置方式:

<bean id="myBean" class="com.example.MyBeanFactory" factory-method="createInstance" />

Java配置方式:

@Configuration
public class AppConfig {
    @Bean
    public MyBeanClass myBean() {
        return MyBeanFactory.createInstance();
    }
}

3.实例工厂方法实例化:通过调用实例工厂的方法来创建Bean的实例。
XML配置方式:

<bean id="myFactory" class="com.example.MyFactoryClass" />
<bean id="myBean" factory-bean="myFactory" factory-method="createInstance" />

Java配置方式:

@Configuration
public class AppConfig {
    @Bean
    public MyFactoryClass myFactory() {
        return new MyFactoryClass();
    }

    @Bean
    public MyBeanClass myBean() {
        return myFactory().createInstance();
    }
}

4.通过@Component等注解实例化:在Spring中,可以使用@Component、@Service、@Repository等注解来标记一个类为一个Bean,并由Spring容器来实例化。
java
Copy code
@Component
public class MyBeanClass {
// Bean的配置
}
5.通过工厂Bean实例化:使用Spring的工厂Bean来创建Bean的实例。工厂Bean是一种特殊的Bean,它负责创建其他Bean的实例。
XML配置方式:

<bean id="myFactoryBean" class="com.example.MyFactoryBean" />
<bean id="myBean" factory-bean="myFactoryBean" factory-method="createInstance" />

Java配置方式:

@Configuration
public class AppConfig {
    @Bean
    public MyFactoryBean myFactoryBean() {
        return new MyFactoryBean();
    }

    @Bean
    public MyBeanClass myBean() {
        return myFactoryBean().createInstance();
    }
}

以上是一些常见的Bean实例化方式(ai回答,常见的回答是前三个)。在使用这些方式时,Spring容器会负责管理Bean的生命周期,包括实例化、属性注入、初始化、销毁等过程。开发者只需要在配置文件或者Java配置类中定义Bean的配置信息,Spring容器会自动根据配置来实例化和管理Bean。

Spring中有哪些方式可以把Bean注入到IOC容器

  1. 使用xml的方式来声明Bean的定义,Spring容器在启动的时候会加载并解析这个xml,把bean装载到IOC容器中。
<bean id="myBean" class="com.example.MyBeanClass">
    <!-- Bean的配置 -->
</bean>
  1. 使用@CompontScan注解或者xml组件扫描来扫描声明了@Controller、@Service、@Repository、@Component注解的类。
<context:component-scan base-package="com.example" />
  1. 使用@Configuration注解声明配置类,并使用@Bean注解实现Bean的定义,这种方式其实是xml配置方式的一种演变,是Spring迈入到无配置化时代的里程碑。
@Configuration
public class AppConfig {
    @Bean
    public MyBeanClass myBean() {
        // Bean的配置
        return new MyBeanClass();
    }
}
  1. 使用@Import注解,导入配置类或者普通的Bean
@Configuration
@Import({OtherConfig.class, AnotherConfig.class})
public class AppConfig {
    // Bean的配置
}
  1. 使用FactoryBean工厂bean,动态构建一个Bean实例,Spring Cloud OpenFeign里面的动态代理实例就是使用FactoryBean来实现的。
  2. 实现ImportBeanDefinitionRegistrar接口,可以动态注入Bean实例。这个在Spring Boot里面的启动注解有用到。
  3. 实现ImportSelector接口,动态批量注入配置类或者Bean对象,这个在Spring Boot里面的自动装配机制里面有用到。

spring中bean依赖注入的方式

1.set方法注入

<bean id="dependencyBean" class="com.example.DependencyBean" />
<bean id="myBean" class="com.example.MyBeanClass">
    <property name="dependencyBean" ref="dependencyBean" />
</bean>

2.构造器注入

<bean id="dependencyBean" class="com.example.DependencyBean" />
<bean id="myBean" class="com.example.MyBeanClass">
    <constructor-arg ref="dependencyBean" />
</bean>

3.静态工厂注入
4.实例工厂注入