在spring中可以使用 @Component @Configuration @Bean(实例化后返回该bean)进行类实例的自动装配。
需求:
排除指定需要自动转配的类。
说明:
1、在以上注解中 @Component @Configuration 可以通过 SpringApplication(exclude/excludeName) / @ComponentScan(excludeFilters={@Filter(type=FilterType.ANNOTATION,value=EnableWebMvc.class)}) 方法进行排除制定类。
2、其中可以使用类的全路径限定名,如:xxx.xxx.xxx.RedisConfig。或者class类型,如RedisConfig.class 进行排除。
3、但如果是在类中使用@Bean声明的类实例,等不到类限定名称,也得不到该类的 class 。因此无法使用以上两种排除方式。
解决:
在使用@Bean注解自动装配类实例时,使用@Conditional进行判断,如果符合某种条件,则装配该实例。
如:
@Primary @Bean(name="dataSource") @Conditional(CommonDbCondition.class) public DataSource dataSource() { DataSource datasource = null; try { DataSource datasource = new DataSource(); // 省略 return datasource; } catch (Exception e) { logger.error("db configuration initialization filter", e); } return datasource; }
CommonDbCondition类如下:
public class CommonDbCondition implements Condition{ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { String dbtype = context.getEnvironment().getProperty("jdbc.datasource.type"); return PubString.isNullOrSpace(dbtype) } }
因此可以自由控制该实例是否装配。
以上。
原文地址:https://www.cnblogs.com/hfultrastrong/p/9842598.html
时间: 2024-10-09 10:27:32