zoukankan      html  css  js  c++  java
  • 注解方式配置bean实践

    注解配置方式有以下几种

    1、@Component声明

    2、配置类中使用@Bean

    3、实现FactoryBean

    4、实现BeanDefinitionRegistryPostProcessor

    5、实现ImportBeanDefinitionRegistrar

    最常见的是第1中和第2种。

    使用注解的优点:

    使用简单

    开发效率高

    高内聚(类的定义和注解是维护在一个文件内的,不会分散开来)

    使用注解的缺点

    配置分散。不像xml,配置几种在xml文件中。

    对象关系不清晰。

    配置修改需要重新编译工程。因为配置在java文件中

    注解方式配置bean实践

    1、@Component声明

    1)增加@Component声明

     2)在测试类中使用

    3)输出结果

    2、配置类中使用@Bean

    1)增加配置文件

     Dog类如下

    public class Dog extends  Animal {
        @Override
        String getName() {
            return "Dog";
        }
    }
    

      

    Animal类如下

    public abstract class Animal {
        abstract String getName();
    }
    

      

    2)在Animal成员变量中增加注解Autowired ,创建hello2方法

    3)增加测试类

    4)输出结果

    3、实现FactoryBean

    1)创建MyCat

    @Component
    public class MyCat implements FactoryBean<Animal> {
    
        @Nullable
        @Override
        public Animal getObject() throws Exception {
            return new Cat();
        }
    
        @Nullable
        @Override
        public Class<?> getObjectType() {
            return Animal.class;
        }
    
    
    }
    

      

    2)增加Qualifier指定是哪个bean。因此此时会有两个bean

     下图是用Qualifier指定是哪个bean

    3)运行测试方法testHello2, 输出结果

       @Test
        public void testHello2() {
            System.out.println(helloService.hello2());
        }
    

      结果为:

    4 实现BeanDefinitionRegistryPostProcessor

    1)创建Monkey类

    public class Monkey extends  Animal {
        @Override
        String getName() {
            return "monkey";
        }
    }
    

      

    2)创建MyBeanRegister 类,并实现BeanDefinitionRegistryPostProcessor接口

    @Component
    public class MyBeanRegister implements BeanDefinitionRegistryPostProcessor{
        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
            rootBeanDefinition.setBeanClass(Monkey.class);
            beanDefinitionRegistry.registerBeanDefinition("monkey",rootBeanDefinition);
        }
    
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
    
        }
    }
    

      

     3)修改HelloService2的Qualifier为monkey

    4)运行测试方法testHello2, 输出结果

       @Test
        public void testHello2() {
            System.out.println(helloService.hello2());
        }
    

      结果为:

    5、实现ImportBeanDefinitionRegistrar

    1)创建Bird类

    public class Bird extends  Animal {
        @Override
        String getName() {
            return "bird";
        }
    }
    

     

    2)创建类MyBeanImport ,实现ImportBeanDefinitionRegistrar接口

    public class MyBeanImport implements ImportBeanDefinitionRegistrar {
        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
            rootBeanDefinition.setBeanClass(Bird.class);
            registry.registerBeanDefinition("bird",rootBeanDefinition);
    
        }
    }
    

      

    3)修改HelloService2的Qualifier为bird

    4)运行测试方法testHello2, 输出结果

       @Test
        public void testHello2() {
            System.out.println(helloService.hello2());
        }
    

      结果为:

     

  • 相关阅读:
    python邮件之附件
    python3.5之smtp
    一台Linux上搭建两个tomcat
    mysql 初探(一)
    python监视mysql最大连接数
    P3658 [USACO17FEB]Why Did the Cow Cross the Road III P cdq分治
    P4793 [AHOI2008]矩形藏宝地 cdq分治 线段树
    P2487 [SDOI2011]拦截导弹 线段树 cdq分治
    P3157 [CQOI2011]动态逆序对 cdq分治
    P4169 [Violet]天使玩偶/SJY摆棋子 cdq分治
  • 原文地址:https://www.cnblogs.com/linlf03/p/12365886.html
Copyright © 2011-2022 走看看