系列二十六、要将一个第三方的类配置成bean有哪些方式

一、要将一个第三方的类配置成bean有哪些方式

1.1、方式一:@Bean

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/26 9:50
 * @Description:
 */
@Configuration
@ComponentScan(basePackages = "org.star")
public class MySpringConfig {

    /**
     * 方式一:通过@Bean的方式将一个第三方的类注册成bean
     * 优点:能控制bean的创建过程
     * @return
     */
    @Bean
    public DruidDataSource druidDataSource() {
        return new DruidDataSource();
    }

}

1.2、方式二:@Import(Class)

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/26 9:50
 * @Description: 方式二:通过@Import(第三方类.class)将一个第三方的类注册为bean
 * 缺点:无法干预bean的实例化过程
 */
@Configuration
@ComponentScan(basePackages = "org.star")
@Import(DruidDataSource.class)
public class MySpringConfig {

}

1.3、方式三:@Import({MyImportBeanDefinitionRegistrar.class})

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/28 17:45
 * @Description: 方式三:实现ImportBeanDefinitionRegistrar,重写registerBeanDefinitions,将第三方的类注册为一个bean
 */
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
        /**
         * 原理:BeanDefinition存储着bean的定义信息,决定着bean是如何生产的
         */
        RootBeanDefinition beanDefinition = new RootBeanDefinition(DruidDataSource.class);
        MutablePropertyValues propertyValues = beanDefinition.getPropertyValues();
        propertyValues.add("username","root");
        propertyValues.add("password","tiger");

        registry.registerBeanDefinition("dataSource",beanDefinition);
    }
}

1.4、方式四:@Import({MyBeanDefinitionRegistryPostProcessor.class})

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/10/27 18:52
 * @Description:
 */
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {

    /**
     * 作用:动态注册BeanDefinition
     * 调用时机:IOC加载时注册BeanDefinition的时候会调用
     * @param registry the bean definition registry used by the application context
     * @throws BeansException
     */
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        RootBeanDefinition definition = new RootBeanDefinition(DruidDataSource.class);
        MutablePropertyValues propertyValues = definition.getPropertyValues();
        propertyValues.add("username","admin");
        propertyValues.add("password","admin123456");
        registry.registerBeanDefinition("druidDataSource",definition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

    }
}

你可能感兴趣的:(Spring全家桶面试系列,java,前端,数据库)