Spring 自动转配类 在类中使用@Bean 注解进行转配但是需要排除该类说明

在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

Spring 自动转配类 在类中使用@Bean 注解进行转配但是需要排除该类说明的相关文章

Spring源码解析 – @Configuration配置类及注解Bean的解析

在分析Spring 容器创建过程时,我们知道容器默认会加载一些后置处理器PostPRocessor,以AnnotationConfigApplicationContext为例,在构造函数中初始化reader时,加载默认后置处理器.其中 ConfigurationClassPostProcessor这个后置处理器专门处理带有@Configuration注解的类,ConfigurationClassPostProcessor后置处理实现了BeanDefinitionRegistryPostProce

Spring实战(四)Spring高级装配中的bean profile

profile的原意为轮廓.剖面等,软件开发中可以译为"配置". 在3.1版本中,Spring引入了bean profile的功能.要使用profile,首先要将所有不同的bean定义整理到一个或多个profile中,在将应用部署到每个环境时,要确保对应的profile处于激活(active)状态. 1.@Profile注解应用在类上 在一个类上使用JavaConfig中的注解@Profile("xxx"),指定这个类中的bean属于某一个profile. 它告诉S

spring自动注入的三种方式

所谓spring自动注入,是指容器中的一个组件中需要用到另一个组件(例如聚合关系)时,依靠spring容器创建对象,而不是手动创建,主要有三种方式: 1. @Autowired注解——由spring提供 2. @Resource注解——由JSR-250提供 3. @Inject注解——由JSR-330提供 @Autowired注解的使用方法 @Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, E

《spring实战》学习笔记-第二章:装配bean

2.1 Spring配置的可选方案 当描述bean如何进行装配时,Spring具有非常大的灵活性,它提供了三种主要的装配机制: (1)在XML中进行显式配置. (2)在Java中进行显式配置. (3)隐式的bean发现机制和自动装配. 建议是尽可能地使用自动配置的机制.显式配置越少越好.当你必须要显式配置bean的时候(比如,有些源码不是由你来维护的,而当你需要为这些代码配置bean的时候),我推荐使用类型安全并且比XML更加强大的JavaConfig.最后,只有当你想要使用便利的XML命名空间

我爱Java系列之---【SpringBoot中常用的注解和两种注入方式】

@EnableConfigurationProperties(DataSourceProperties.class) 来声明要使用DataSourceProperties 这个类并初始化该类对象,该类不用放在IOC容器中,可以通过该注解直接使用. [email protected]:一般写在类上边,通过该注解将当前类初始化到Spring的IOC容器中,其他类若想调用,直接用@Autowired去容器中拿. [email protected]: 一般写在类上边,标明该类是一个配置类,被注解的类内部

spring中的annotation注解类配置

1,@Autowired     1) @Autowired使用后需要在xml文件加入以下配置才能生效: <context:annotation-config/> 2)@Autowired默认使用byType来装配属性,如果匹配到类型的多个实例,再通过byName来确定Bean. 2,@Resource 1)@Resource的作用和@Autowired差不多,只不过 @Resource是默认先用byName,如果找不到合适的就再用byType来注入 2)在xml文件加入以下配置才能生效: &

普通java类调用spring中的bean

使用ssm项目,很多service,dao等都使用了注解方式定义,普通java类要获取到这些bean,可这么写: public class Common { private UserService userService; public Common() { @SuppressWarnings("resource") AbstractApplicationContext ctx = new ClassPathXmlApplicationContext(new String []{&qu

spring不断重新加载所有类文件

第一次写博文,可能有点兴奋和啰嗦,先说说使用的环境:resin+spring+struts,服务器是测试用的,由运维同事维护,里面有几个项目,仅供开发的同事修改. 事情从昨天下午开始, 查看测试服务器log时,发现spring不断的加载类文件,但却没有任何错误信息提示,初步判断应该是某开发的同事修改了配置文件导致的问题,但看了一遍没发现什么问题,难道服务器作了什么动作?于是问了一名运维同事,说没作什么修改,一听心血来潮,因为这个问题可以加入我的问题库里面. 因为配置正常,怀疑是某些类加载不正常导

在ContextLoaderListener中使用注解注入的类和job中使用注解注入的类

场景:在ContextLoaderListener子类中加载job,为JobFactory的实现类声明@Component后,在ContextLoaderListener子类中为scheduler设置JobFactory.(主要解决的问题:在spring与quartz调用job时,job中无法读取注解类,实现注入) 步骤一: ContextLoaderListener子类中contextInitialized方法中代码如下: super.contextInitialized(event); ap