目录
- 一、说明
- 二、四种方式
- 三、代码示例
- 3.1 @Bean方式
- 3.2 @Bean方式
- 3.3 @Import导入ImportBeanDefinitionRegistrar实现类
- 3.4 BeanDefinitionRegistryPostProcessor
一、说明
- 1.第三方的bean不能改写源码,在类上加@Component注解
- 2.只能引入该类进行反射创建,再更改其BeanDefinition信息
二、四种方式
- 1.@Bean方式,实例化过程可以更改
- 2.@Import导入类,实例化过程不能干预
- 3.@Import导入ImportBeanDefinitionRegistrar实现类,可以给BeanDefinition设置属性等信息
- 4.beanDefinition注册后置处理器(BeanDefinitionRegistryPostProcessor),不需要@Import引入,但顺序在后面
三、代码示例
3.1 @Bean方式
package com.learning.bean;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Author wangyouhui* @Description 配置类**/
@Configuration
public class BeanConfig {@Beanpublic DruidDataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUsername("root");return dataSource;}
}
3.2 @Bean方式
package com.learning.bean;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;/*** @Author wangyouhui* @Description 配置类**/
@Configuration
@Import(DruidDataSource.class)
public class BeanConfig2 {
}
3.3 @Import导入ImportBeanDefinitionRegistrar实现类
package com.learning.bean;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.type.AnnotationMetadata;/*** @Author wangyouhui* @Description 配置类**/
@Configuration
@Import(ImportBeanDefinitionRegistrar.class)
public class BeanConfig3 {
}class ImportBeanDefinitionRegistrar implements org.springframework.context.annotation.ImportBeanDefinitionRegistrar{@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {// BeanDefinition存储Bean的描述信息,决定Bean生产方式RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(DruidDataSource.class);rootBeanDefinition.getPropertyValues().add("password", "root");registry.registerBeanDefinition("dataSource", rootBeanDefinition);}
}
3.4 BeanDefinitionRegistryPostProcessor
package com.learning.bean;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.stereotype.Component;/*** @Author wangyouhui* @Description beanDefinition注册后置处理器**/
@Component
public class BeanDefinitionRegistryPostProcessor implements org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {RootBeanDefinition beanDefinition = new RootBeanDefinition();beanDefinition.getPropertyValues().add("password", "root");beanDefinitionRegistry.registerBeanDefinition("dataSource", beanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {}
}