在组件中定义Bean元数据

2024-10-13 23:10:21

1、Spring组件还可以向容器提供bean定义元数据。您可以 @Bean 使用用于在带 @Configuration 注释的类中定义bean元数据的相同注释来执行此操作。以下示例显示了如何执行此操作:

在组件中定义Bean元数据

2、前面的类是一个Spring组件,在其 doWork() 方法中具有特定于应用程序的代码 。但是,它还提供了一个bean定义,该定义具有引用该方法的工厂方法 publicInstance() 。盐淬芪求该 @Bean 注释标识工厂方法和其它bean定义特性,如通过一个限定值 @Qualifier 注释。可以指定其他方法级别的注解是@Scope , @Lazy 和自定义限定器注解。

在组件中定义Bean元数据

3、如前所述,支持自动装配的字段和方法,以及对 @Bean 方法的自动装配的额外支持。以下示例显示了如何执行此操作:

在组件中定义Bean元数据

4、该示例将Stringmethod参数自动装配country到age另一个名为的bean的属性值privateInstance。Spri荏鱿胫协ng Expression Language元素通过符号定义属性的值#{ <expression> }。对于@Value注释,表达式解析器预先配置为在解析表达式文本时查找bean名称。

在组件中定义Bean元数据

5、从Spring Framework 4.3开始,您还可以声明类型的工厂方法参数InjectionPoint(或其更具体的子类:),DependencyDescriptor以访问触发创建当前bean的请求注入点。请注意,这仅适用于实例创建bean实例,而不适用于注入现有实例。因此,此功能对原型范围的bean最有意义。对于其他作用域,工厂方法只能看到触发在给定作用域中创建新Bean实例的注入点(例如,触发创建惰性单例bean的依赖项)。在这种情况下,您可以使用提供的注入点元数据和语义关注。以下示例显示了如何使用InjectionPoint:

在组件中定义Bean元数据

6、将@Bean在普通的Spring组件方法比spring里的同行处理方式不同@Configuration类。不同之处在于@Component,CGLIB不会增强类来拦截方法和字段的调用。

7、CGLIB代理是调用类中@Bean方法中的方法或字段@Configuration创建对协作对象的bean元数据引用的方法。这些方法不是用普通的Java语义调用的,而是通过容器来提供通常的生命周期管理和Spring bean的代理,即使在通过对@Bean方法的编程调用引用其他bean时也是如此。

在组件中定义Bean元数据

8、相反,@Bean在plain中的方法中调用方法或字段@Componentclass具有标准的Java语义,没有特殊的CGLIB处理或其他约束应用。

在组件中定义Bean元数据
猜你喜欢