2019.6.29 Spring注解-Bean的注册

6.29

  • 向容器中注入组件的几种方式:

    • @Controller、@Service、@Respority、@Component

    • @Bean

    • @Import,接受class数组,组件名是数组内class的全类名

      • 注解中的那些类也可以是ImportSelector接口的实现类,需要实现一个selectImports方法,这个方法的返回值是一个要注解类的全类名(String[])数组

      • 注解中的类也可以是ImportBeanDefinationRegistrar接口的实现类,需要实现registerBeanDefinations方法,这个方法的形参是AnnotationMetadata(当前类的注册信息)和BeanDefinationRegistry(BeanDefination注册类)。BeanDefinationRegister对象的registerBeanDefination方法可以将bean注册,该方法除了需要注解bean的id,还需要BeanDefination对象,这个对象是对注解类的包装,可以使用这个类的有参构造器(参数就是要注解的类)来进行初始化

        public class My implements ImportBeanDefinitionRegistrar {
        
            @Override
            public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
                BeanDefinition b = new RootBeanDefinition(Color.class);
                beanDefinitionRegistry.registerBeanDefinition("color",b);
            }
        }
        
    • BeanFactory(工厂Bean)

      • 类实现FactoryBean接口,需要一个类的泛型,这个类就是注入的bean

      • 在配置类里面用@Bean的方式去注入这个FactoryBean的实现类,

      • 注意:容器中注入的Bean的id是方法名,但是实际注入的Bean的类型是这个工厂Bean的泛型

      • 如果需要获取这个工厂Bean,需要在GetBean方法的形参内添加“&”

        public class MyColorFactory implements FactoryBean<Color> {
            @Override
            public Color getObject() throws Exception {
                return new Color();
            }
        
            @Override
            public Class<?> getObjectType() {
                return Color.class;
            }
        
            @Override
            public boolean isSingleton() {
                return false;
            }
        }
        
        
        Object getcolor = applicationContext.getBean("&getcolor");
        
  • Bean生命周期:创建、初始化、销毁。

    • 初始化和销毁的方式分别是在原来xml配置的方式中是通过<Bean>标签的init-method、destroy-method来指定对应方法的。方法不能有参数,但可以抛异常。
    • 也可以通过@Bean注解的init-method、destroy-method来制定对应的方法。
    • 注意:多实例模式下,当执行ApplicationContext.close()方法时,容器不会调用销毁方法。需要自己手动调用。
  • 将需要注入的Bean手动实现InitializingBean和DisposableBean接口来实现。

  • 使用JSR250中的@PostConstruct(Bean属性配置完成)和@PreDestroy(注解到相应的方法)(销毁容器之前调用)来实现

posted @ 2019-06-30 10:41  X1aoHei  阅读(183)  评论(0编辑  收藏  举报