如何归纳总结四种Bean注入Spring框架的方法?

2026-05-22 06:071阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1875个文字,预计阅读时间需要8分钟。

如何归纳总结四种Bean注入Spring框架的方法?

提到Spring,大家首先想到的可能是其AOP(面向切面编程)和IOC(控制反转)这两大特性。Spring的IOC特性允许我们管理Bean的创建和生命周期,而AOP则允许我们在不修改业务逻辑的情况下,添加额外的功能,如日志、事务管理等。

具体来说,Spring中的Bean初始化流程包括以下几个步骤:

1. 定义Bean配置:通过XML、注解或Java配置方式定义Bean的属性、依赖关系等。

2.加载配置:Spring容器读取配置信息,创建Bean的定义信息。

3.实例化Bean:根据Bean的定义信息,Spring容器创建Bean的实例。

4.设置属性:根据Bean的定义,Spring容器将属性值注入到Bean实例中。

如何归纳总结四种Bean注入Spring框架的方法?

5.初始化Bean:调用Bean的初始化方法,完成Bean的初始化工作。

6.使用Bean:Bean实例可以被Spring容器管理,也可以在应用程序中被直接使用。

7.销毁Bean:当Bean不再需要时,Spring容器会调用其销毁方法,释放资源。

至于Spring Cloud,它是基于Spring Boot实现的微服务架构开发工具集,提供了配置管理、服务发现、断路器等丰富的功能,帮助开发者快速构建分布式系统。

今天,我们就从Spring的IOC特性入手,聊一聊Spring的相关知识。

一提到Spring,大家最先想到的是啥?是AOPIOC的两大特性?是SpringBean的初始化流程?还是基于SpringSpring Cloud全家桶呢?

今天我们就从SpringIOC特性入手,聊一聊Spring中把Bean注入Spring容器的几种方式。

我们先来简单了解下IOC的概念:IOC控制反转,也称为依赖注入,是指将对象的创建或者依赖关系的引用从具体的对象控制转为框架或者IOC容器来完成,也就是依赖对象的获得被反转了。

可以简单理解为原来由我们来创建对象,现在由Spring来创建并控制对象。

xml 方式

依稀记得最早接触Spring的时候,用的还是SSH框架,不知道大家对这个还有印象吗?所有的bean的注入得依靠xml文件来完成。

它的注入方式分为:set方法注入、构造方法注入、字段注入,而注入类型分为值类型注入(8种基本数据类型)和引用类型注入(将依赖对象注入)。

以下是set方法注入的简单样例

<bean name="teacher" class="org.springframework.demo.model.Teacher"> <property name="name" value="阿Q"></property> </bean>

对应的实体类代码

public class Teacher { private String name; public void setName(String name) { this.name = name; } }

xml方式存在的缺点如下:

  1. xml文件配置起来比较麻烦,既要维护代码又要维护配置文件,开发效率低;
  2. 项目中配置文件过多,维护起来比较困难;
  3. 程序编译期间无法对配置项的正确性进行验证,只能在运行期发现并且出错之后不易排查;
  4. 解析xml时,无论是将xml一次性装进内存,还是一行一行解析,都会占用内存资源,影响性能。
注解方式

随着Spring的发展,Spring 2.5开始出现了一系列注解,除了我们经常使用的@Controller、@Service、@Repository、@Component 之外,还有一些比较常用的方式,接下来我们简单了解下。

@Configuration + @Bean

当我们需要引入第三方的jar包时,可以用@Bean注解来标注,同时需要搭配@Configuration来使用。

  • @Configuration用来声明一个配置类,可以理解为xml<beans>标签

  • @Bean 用来声明一个bean,将其加入到Spring容器中,可以理解为xml<bean>标签

简单样例:将 RedisTemplate 注入 Spring

@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); ...... return redisTemplate; } } @Import

我们在翻看Spring源码的过程中,经常会看到@Import注解,它也可以用来将第三方jar包注入Spring,但是它只可以作用在上。

例如在注解EnableSpringConfigured上就包含了@Import注解,用于将SpringConfiguredConfiguration配置文件加载进Spring容器。

@Import(SpringConfiguredConfiguration.class) public @interface EnableSpringConfigured {}

@Importvalue值是一个数组,一个一个注入比较繁琐,因此我们可以搭配ImportSelector接口来使用,用法如下:

@Configuration @Import(MyImportSelector.class) public class MyConfig {} public class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[]{"org.springframework.demo.model.Teacher","org.springframework.demo.model.Student"}; } }

其中selectImports方法返回的数组就会通过@Import注解注入到Spring容器中。

无独有偶,ImportBeanDefinitionRegistrar接口也为我们提供了注入bean的方法。

@Import(AspectJAutoProxyRegistrar.class) public @interface EnableAspectJAutoProxy { ...... }

我们点击AspectJAutoProxyRegistrar类,发现它实现了ImportBeanDefinitionRegistrar接口,它的registerBeanDefinitions方法便是注入bean的过程,可以参考下。

如果觉得源代码比较难懂,可以看一下我们自定义的类

@Configuration @Import(value = {MyImportBeanDefinitionRegistrar.class}) public class MyConfig {} public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { RootBeanDefinition tDefinition = new RootBeanDefinition(Teacher.class); // 注册 Bean,并指定bean的名称和类型 registry.registerBeanDefinition("teacher", tDefinition); } } }

这样我们就把Teacher类注入到Spring容器中了。

FactoryBean

提到FactoryBean,就不得不与BeanFactory比较一番。

  • BeanFactory : 是 FactoryIOC容器或者对象工厂,所有的Bean都由它进行管理
  • FactoryBean : 是Bean ,是一个能产生或者修饰对象生成的工厂 Bean,实现与工厂模式和修饰器模式类似

那么FactoryBean是如何实现bean注入的呢?

先定义实现了FactoryBean接口的类

public class TeacherFactoryBean implements FactoryBean<Teacher> { /** * 返回此工厂管理的对象实例 **/ @Override public Teacher getObject() throws Exception { return new Teacher(); } /** * 返回此 FactoryBean 创建的对象的类型 **/ @Override public Class<?> getObjectType() { return Teacher.class; } }

然后通过 @Configuration + @Bean的方式将TeacherFactoryBean加入到容器中

@Configuration public class MyConfig { @Bean public TeacherFactoryBean teacherFactoryBean(){ return new TeacherFactoryBean(); } }

注意:我们没有向容器中注入Teacher, 而是直接注入的TeacherFactoryBean,然后从容器中拿Teacher这个类型的bean,成功运行。

BDRegistryPostProcessor

看到这个接口,不知道对于翻看过Spring源码的你来说熟不熟悉。如果不熟悉的话请往下看,要是熟悉的话就再看一遍吧

标签:方式

本文共计1875个文字,预计阅读时间需要8分钟。

如何归纳总结四种Bean注入Spring框架的方法?

提到Spring,大家首先想到的可能是其AOP(面向切面编程)和IOC(控制反转)这两大特性。Spring的IOC特性允许我们管理Bean的创建和生命周期,而AOP则允许我们在不修改业务逻辑的情况下,添加额外的功能,如日志、事务管理等。

具体来说,Spring中的Bean初始化流程包括以下几个步骤:

1. 定义Bean配置:通过XML、注解或Java配置方式定义Bean的属性、依赖关系等。

2.加载配置:Spring容器读取配置信息,创建Bean的定义信息。

3.实例化Bean:根据Bean的定义信息,Spring容器创建Bean的实例。

4.设置属性:根据Bean的定义,Spring容器将属性值注入到Bean实例中。

如何归纳总结四种Bean注入Spring框架的方法?

5.初始化Bean:调用Bean的初始化方法,完成Bean的初始化工作。

6.使用Bean:Bean实例可以被Spring容器管理,也可以在应用程序中被直接使用。

7.销毁Bean:当Bean不再需要时,Spring容器会调用其销毁方法,释放资源。

至于Spring Cloud,它是基于Spring Boot实现的微服务架构开发工具集,提供了配置管理、服务发现、断路器等丰富的功能,帮助开发者快速构建分布式系统。

今天,我们就从Spring的IOC特性入手,聊一聊Spring的相关知识。

一提到Spring,大家最先想到的是啥?是AOPIOC的两大特性?是SpringBean的初始化流程?还是基于SpringSpring Cloud全家桶呢?

今天我们就从SpringIOC特性入手,聊一聊Spring中把Bean注入Spring容器的几种方式。

我们先来简单了解下IOC的概念:IOC控制反转,也称为依赖注入,是指将对象的创建或者依赖关系的引用从具体的对象控制转为框架或者IOC容器来完成,也就是依赖对象的获得被反转了。

可以简单理解为原来由我们来创建对象,现在由Spring来创建并控制对象。

xml 方式

依稀记得最早接触Spring的时候,用的还是SSH框架,不知道大家对这个还有印象吗?所有的bean的注入得依靠xml文件来完成。

它的注入方式分为:set方法注入、构造方法注入、字段注入,而注入类型分为值类型注入(8种基本数据类型)和引用类型注入(将依赖对象注入)。

以下是set方法注入的简单样例

<bean name="teacher" class="org.springframework.demo.model.Teacher"> <property name="name" value="阿Q"></property> </bean>

对应的实体类代码

public class Teacher { private String name; public void setName(String name) { this.name = name; } }

xml方式存在的缺点如下:

  1. xml文件配置起来比较麻烦,既要维护代码又要维护配置文件,开发效率低;
  2. 项目中配置文件过多,维护起来比较困难;
  3. 程序编译期间无法对配置项的正确性进行验证,只能在运行期发现并且出错之后不易排查;
  4. 解析xml时,无论是将xml一次性装进内存,还是一行一行解析,都会占用内存资源,影响性能。
注解方式

随着Spring的发展,Spring 2.5开始出现了一系列注解,除了我们经常使用的@Controller、@Service、@Repository、@Component 之外,还有一些比较常用的方式,接下来我们简单了解下。

@Configuration + @Bean

当我们需要引入第三方的jar包时,可以用@Bean注解来标注,同时需要搭配@Configuration来使用。

  • @Configuration用来声明一个配置类,可以理解为xml<beans>标签

  • @Bean 用来声明一个bean,将其加入到Spring容器中,可以理解为xml<bean>标签

简单样例:将 RedisTemplate 注入 Spring

@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); ...... return redisTemplate; } } @Import

我们在翻看Spring源码的过程中,经常会看到@Import注解,它也可以用来将第三方jar包注入Spring,但是它只可以作用在上。

例如在注解EnableSpringConfigured上就包含了@Import注解,用于将SpringConfiguredConfiguration配置文件加载进Spring容器。

@Import(SpringConfiguredConfiguration.class) public @interface EnableSpringConfigured {}

@Importvalue值是一个数组,一个一个注入比较繁琐,因此我们可以搭配ImportSelector接口来使用,用法如下:

@Configuration @Import(MyImportSelector.class) public class MyConfig {} public class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[]{"org.springframework.demo.model.Teacher","org.springframework.demo.model.Student"}; } }

其中selectImports方法返回的数组就会通过@Import注解注入到Spring容器中。

无独有偶,ImportBeanDefinitionRegistrar接口也为我们提供了注入bean的方法。

@Import(AspectJAutoProxyRegistrar.class) public @interface EnableAspectJAutoProxy { ...... }

我们点击AspectJAutoProxyRegistrar类,发现它实现了ImportBeanDefinitionRegistrar接口,它的registerBeanDefinitions方法便是注入bean的过程,可以参考下。

如果觉得源代码比较难懂,可以看一下我们自定义的类

@Configuration @Import(value = {MyImportBeanDefinitionRegistrar.class}) public class MyConfig {} public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { RootBeanDefinition tDefinition = new RootBeanDefinition(Teacher.class); // 注册 Bean,并指定bean的名称和类型 registry.registerBeanDefinition("teacher", tDefinition); } } }

这样我们就把Teacher类注入到Spring容器中了。

FactoryBean

提到FactoryBean,就不得不与BeanFactory比较一番。

  • BeanFactory : 是 FactoryIOC容器或者对象工厂,所有的Bean都由它进行管理
  • FactoryBean : 是Bean ,是一个能产生或者修饰对象生成的工厂 Bean,实现与工厂模式和修饰器模式类似

那么FactoryBean是如何实现bean注入的呢?

先定义实现了FactoryBean接口的类

public class TeacherFactoryBean implements FactoryBean<Teacher> { /** * 返回此工厂管理的对象实例 **/ @Override public Teacher getObject() throws Exception { return new Teacher(); } /** * 返回此 FactoryBean 创建的对象的类型 **/ @Override public Class<?> getObjectType() { return Teacher.class; } }

然后通过 @Configuration + @Bean的方式将TeacherFactoryBean加入到容器中

@Configuration public class MyConfig { @Bean public TeacherFactoryBean teacherFactoryBean(){ return new TeacherFactoryBean(); } }

注意:我们没有向容器中注入Teacher, 而是直接注入的TeacherFactoryBean,然后从容器中拿Teacher这个类型的bean,成功运行。

BDRegistryPostProcessor

看到这个接口,不知道对于翻看过Spring源码的你来说熟不熟悉。如果不熟悉的话请往下看,要是熟悉的话就再看一遍吧

标签:方式