当前位置:首页 > 数码 > Spring中Bean注入IOC容器的方式 (springboot启动)

Spring中Bean注入IOC容器的方式 (springboot启动)

admin5个月前 (05-05)数码21

Bean definition is a way to define the metadata for a bean in a Spring application. It contains information such as the bean's class, scope, dependencies, and lifecycle methods.

XML Configuration

In Spring, beans can be defined using an XML file. The XML file contains a list of bean definitions, which are then parsed and loaded into the Spring container when the application starts.

xml

Annotation Configuration

Since Spring 2.5, beans can also be defined using annotations. The following annotations are used to define beans:

  • @Component : This annotation is used to define a bean that is automatically detected by Spring when it scans the classpath for annotated classes.
  • @Service : This annotation is used to define a bean that represents a service.
  • @Repository : This annotation is used to define a bean that represents a data access object.
  • @Controller : This annotation is used to define a bean that handles web requests.
java @Component public class MyBean { // Bean logic }

Other Bean Definition Methods

In addition to XML and annotation configuration, there are several other ways to define beans in Spring:

  • @ComponentScan : This annotation can be used to scan a package for annotated classes and automatically register them as beans.
  • @Configuration : This annotation can be used to define a class that contains bean definitions.
  • springboot启动 FactoryBean : This interface can be implemented to create a factory bean that can produce instances of other beans.
  • ImportBeanDefinitionRegistrar : This interface can be implemented to register bean definitions dynamically.
  • ImportSelector : This interface can be implemented to select which bean definitions to register dynamically.

Conclusion

Bean definition is a fundamental concept in Spring. By understanding how to define beans, you can create flexible and maintainable Spring applications.


Spring 优雅注册 Bean 的方式

这篇先说明用法,下篇分析以下场景是如何将 Bean 注册进 IOC容器的。

这种用法在项目中是非常常见的,基本上是必有。我们来看下用法:

这样一个 Bean 就注册进 IOC 容器了,Bean 的名称默认是方法名,并且是不会转换大小写的,也就是假如你的方法名是 TestBean() ,那么 Bean 的名称就是 TestBean 。当然我们也可以使用 name 或者 value 指定 Bean 的名称,比如 @Bean(value = testBean),如果二者同时存在则会报错。

我们来看下其他属性:

autowireCandidate:默认值是 true 。如果设置为 false 的话,那么通过 byType 的方式获取 Bean 就会报错,当然我们可以使用 Resource 注解获取。

initMethod:在 Bean 实例化后调用的初始化方法,值是 Bean 类中的方法名。

destroyMethod:在 Bean 要销毁时调用的清理方法,值是 Bean 类中的方法名。

@Bean 注解只能定义在 @Configuration 类下吗?NO NO NO,它可以定义在任意能被 IOC 扫描的注解下,比如 @Component注解,至于区别,下篇再讲。

先讲普通用法:

深度用法:

ComponentScan 注解中有两个这样的属性:includeFilters 与 excludeFilters,前一个是只包含规则,后一个是排除包含规则,他们的值是一个 @Filter 注解的形式,Filter 中的 type 有 5 中类型,分别如下。

1、ANNOTATION

第一种是以注解的形式包含或不包含,比如:

这里边要配置useDefaultFilters = false 禁用默认规则,因为默认规则是扫描所有,配只包含就没用了。这里的意思只扫描 Configuration 注解。

2、ASSIGNABLE_TYPE

这种是包含我们给定的类型,不管是给定的类型和子类都会被包含进 IOC 容器。

然后我们发现 testBean 注册进去了,为什么我们不标注 @Component 这样的注解实例也会被注册进 IOC 呢?因为 ComponentScan 会扫描包下所有文件,只要符合我们定义的过滤规则,它就会将 Bean 注册进 IOC 容器中。

ASPECTJ 是使用 aspectj 表达式

REGEX 是使用正则表达式

这种呢就是我们 SpringBootApplication 注解用到的方式了,我来解释一下具体规则:这种方式是可以自己自定义扫描规则,它接受一个实现 TypeFilter 接口的类。

当它扫描类的时候扫描到了 TestBean,然后符合了我的匹配规则(也就是返回true)就注册进去了。

下面的例子中,我们直接看 Spring 源码的实现比较具有代表性一点。

我们点进 @EnableTransactionManagement 注解中,发现了这个 @Import(),它的作用就是将类导入,类会被注册进 IOC 容器中。

这个注解放置的位置要是 Spring 能扫描到的地方,不然 Spring 也不会主动去解析这个注解。

如果我们自己要使用注解的话,我们可以做个类似于 EnableTransactionManagement 的功能插拔式导入配置类,这样就可以实现动态开启一些 Bean 了。

我们还是来看下 TransactionManagementConfigurationSelector 这个类,看下它的继承关系发现它间接性的实现了 ImportSelector 接口,主要看它实现的这个方法:

这个方法的作用就是根据你返回的类全限定名()数组来创建 Bean 。

实现了 ImportSelector 的类也是需要使用 @Import 导入。

这个我们来看下 @MapperScan ()导入的 MapperScannerRegistrar 发现它实现了 ImportBeanDefinitionRegistrar:

它的作用是拿到 BeanDefinitionRegistry Bean 的定义信息,然后往里面加 BeanDefinition 就会将相应的对象注册进去,它更深入的就不说了,实际上就是解析下注解属性,然后扫描相应的包下的类注册 Bean。我们自己搞个简单的。

这样就注册了一个 Bean 名称是 testBean 类型是 TestBean 类型的 Bean 了。

如果注册的是一个有参构造器呢?那就这样:

addConstructorArgValue 根据构造器参数的顺序去添加。

实现了 ImportBeanDefinitionRegistrar 的类也是需要使用 @Import 导入。

然后 TestBean 就注册进去了,打印的时候我们发现 Bean 的名称是 MyFactoryBean 的全限定名,但是它的类型是 TestBean 类型的,如果想要获取 MyFactoryBean 类型的 Bean 的话,通过 Bean 名称为 &myFactoryBean 就能获取到。

在我们的Spring Boot项目中,一般都是只扫描主类下的所有类,然后将一些被特定注解标注的类加载到IOC容器,但是如果我们将包分离,我们又如何更加方便的将其他包的类加载进来呢? spring boot提供了一种类似于Java的SPI(服务发现)机制,只要在resources目录下创建META-INF文件夹,再创建 文件,然后再里面配置

这样在导入当前包的就会自动扫描文件,解析后将里面的一些类加载到IOC容器中。具体的实现代码在spring-core的SpringFactoriesLoader类中。

这些就不讲了。

SpringBoot的自动装配(一)

一、什么是SpringBoot的自动装配 SpringBoot的自动装配是指:SpringBoot会自动将一些配置类的bean注册到ioc容器,我们可以在需要的地方使用@Autowired或@Resource等注解来使用它。 自动的表现形式就是我们只需要引我们享用功能的包,其他的配置完全不需要管,springboot会自动注入这些配置备案,我们直接使用就行。 自动装配也是SpringBoot的一个重要的特点,他帮我们做了很多的配置。 二、它是怎样实现的? 1、run方法当启动一个SpringBoot项目时,本质上就是执行了地洞累中的主方法,然后执行了run方法。 ConfigurableApplicationContext这个对象就是 ApplicationContext接口的一个子接口。 其实SpringBoot项目的启动,本质上就是一个Spring的初始化操作。 2、@SpringBootApplication点开这个注解可以发现,这是一个组合注解,包括: 这些注解中,前四个是JDK中的自动元注解,是用来修饰注解的注解。 @ComponentScan是用来扫描路径的,如果不置顶特定的扫描路径的话,扫描的路径是当前修饰的类所在的包及其子包。 而@SpringBootConfiguration这个注解的本质就是@Configuration注解。 所以在这里面跟SpringBoot自动装配有关系的就只有一个了:@EnableAutoConfiguration3、@EnableAutoConfiguration@AutoConfigurationPackage不是用来实现自动装配的,在Spring中,他是用来扫描实体类Entity等注解的。 所以重点是在@Import上。 @Import注解实现了AutoConfigurationImportSelector类,自动装配也是在这个类中进行了具体的实现。 自动装配实现的就是该类中的selectImports方法里。 通过selectImports方法,取到文件下的一系列类名,随后将这些类自动加载至IOC容器中。 4、总结SpringBoot的自动装配也就是通过@EnableAutoConfiguration注解,加载AutoConfigurationImportSelector类中的selectImports方法,进而扫描文件下的自动配置类,并将其装配到IOC容器的过程。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Spring

“Spring中Bean注入IOC容器的方式 (springboot启动)” 的相关文章

概念-Spring-AOP-实现原理和应用-中的 (概念股股票)

概念-Spring-AOP-实现原理和应用-中的 (概念股股票)

什么是AOP? AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,其主要目的是将横切关注点(cross-cutting concern)从主要业务...

如何在Spring名目中顺利性能MP-MyBatis (如何在springer上下载文献)

如何在Spring名目中顺利性能MP-MyBatis (如何在springer上下载文献)

在Spring名目中集成MP,须要启动以下性能: 1.引入依赖:在名目标pom.xml文件中参与MP相关依赖,例如:```xml<dependency><groupId&g...

比如每日有大量用户访问和数据替换-服务器的带宽需求与网站的访问量密切相关-那么就须要更大的带宽来满足需求-访问量-假设你的网站流量大 (比如每日有大事的句子)

比如每日有大量用户访问和数据替换-服务器的带宽需求与网站的访问量密切相关-那么就须要更大的带宽来满足需求-访问量-假设你的网站流量大 (比如每日有大事的句子)

SpringBeanDefinition元信息定义形式 BeanDefinition是一个蕴含Bean元数据的对象。它形容了如何创立Bean实例、Bean属性的值以及Bean之间的依赖相关。...

事务传播行为-Spring-七种类型一览 (spring事务传播行为)

事务传播行为-Spring-七种类型一览 (spring事务传播行为)

简介 Spring 事务传播性是指在 Spring 环境中,当多个包含事务的方法嵌套调用时,每个事务方法如何处理事务上下文中的提交或回滚行为。 传播性行为 Spring 中定义了 7 种事...

6-Spring-提供的四种弱小工具-远程接口调用神器 (6sp日常使用还能用多久)

6-Spring-提供的四种弱小工具-远程接口调用神器 (6sp日常使用还能用多久)

1.引见 Spring6是一个十分弱小的框架,它提供了许多工具和接口来简化远程接口调用。其中,WebClient、RestTemplate、HTTPInterface和RestClient是...

Spring-Boot-Starter原理详解-b-b (springernature)

Spring-Boot-Starter原理详解-b-b (springernature)

SpringBoot Starter 是一种包含了一组特定功能和依赖关系的依赖项,旨在为特定的应用程序场景提供快速集成和开箱即用的功能。主要用于将常用的功能模块打包成一个可重用的依赖项,开发者只需...

容器启动有效的交互-Spring-如何利用-框架提供的才干-让-Bean-深化了解并与-Spring (容器启动过程)

容器启动有效的交互-Spring-如何利用-框架提供的才干-让-Bean-深化了解并与-Spring (容器启动过程)

Spring有一个特点,就是创立进去的Bean对容器是无感的,一个Bean是怎样样被容器从一个Class整成一个Bean的,关于Bean自身来说是不知道的,当然也不须要知道,也就是Bean对容器的...

Boot中高效成功订单30分钟智能敞开的战略指南-Spring-源代码揭秘 (high boot)

Boot中高效成功订单30分钟智能敞开的战略指南-Spring-源代码揭秘 (high boot)

形式一:经常使用定时义务 代码成功如下: 首先,咱们定义一个实体类Order,蕴含基本信息以及订单的创立期间: @EntitypublicclassOrder{@Id@Generat...