IOC容器中加入Bean的方法

            注解@Congiration
                    三层组件:
                        扫描器+三层注解
                    非三层组件:
                        a.@Bean
                        b.@Import
                        c.FactoryBean(工厂Bean)

A、@Bean注解的使用:

 在配置类中的方法上加上@Bean,此时该方法就是IOC容器中的对象;
 

B、@Import注解的使用:

					方式一:
                        直接编写到@Import中, 并且id值 就是全类名;
                        如:
                            //在MyConfig中
                                @Import({Apple.class, Banana.class, Orange.class})
                    方式二:
                         自定义ImportSelector接口的实现类,通过selectimports方法实现
                         (自定义实现类的方法返回值 就是要纳入IOC容器的Bean的全类名)。
                         并且要告知MyConfig自己编写的实现类。@import(自定义是实现类名.class)
                         如:
                            //在ImportSelector接口的实现类【MyImportSelector】中
                                    public class MyImportSelector implements ImportSelector {
                                        @Override
                                        public String[] selectImports(AnnotationMetadata annotationMetadata) {
                                            return new String[] {"org.neowang.entity.Apple",
                                                                    "org.neowang.entity.Banana",
                                                                        "org.neowang.entity.Orange"}; //返回值就是 要加入IOC容器的Bean的全类名
                                        }
                                    }

                            //在MyConfig中
                                    @Import(MyImportSelector.class)

                    方式三:
                        编写ImportBeanDefinitionRegistrar接口的实现类,重写方法。
                            并且要告知MyConfig自己编写的实现类。@import(自定义是实现类名.class)
                          如:
                            //在ImportBeanDefinitionRegistrar接口的实现类【MyImportBeanDefinitionRegistrar】中
                                    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
                                        /**
                                         *
                                         * @param annotationMetadata   注解原数据
                                         * @param beanDefinitionRegistry  Bean的注册信息
                                         */
                                        @Override
                                        public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {

                                            BeanDefinition beanDefinition = new RootBeanDefinition(Orange.class);
                                            //或 BeanDefinition beanDefinition = new RootBeanDefinition("org.neowang.entity.Orange");
                                            beanDefinitionRegistry.registerBeanDefinition("myorange",beanDefinition); //id , class
                                        }
                                    }
                             //在MyConfig中
                                    @Import(MyImportBeanDefinitionRegistrar.class)

C、FactoryBean(工厂bean)

				 1.写实现类【如:MyFactoryBean】和重写其中的方法
                            如:
                            //MyFactoryBean类
                                    public class MyFactoryBean implements FactoryBean {
                                        //外部要从该容器中拿的对象
                                        @Override
                                        public Object getObject() throws Exception {
                                            return new Apple();
                                        }

                                        //bean的类型
                                        @Override
                                        public Class<?> getObjectType() {
                                            return Apple.class;
                                        }

                                        //要加的bean是不是单例模式
                                        @Override
                                        public boolean isSingleton() {
                                            return true;
                                        }
                                    }
                    2.注册到@Bean中
                            如:
                            //MyConfig中
                                      @Bean
                                        public FactoryBean<Apple> myFactoryBean(){
                                            return new MyFactoryBean();
                                        }

                            注意:获取对象时要通过 '&' 区分 要获取的对象时哪一个:
                                        不加'&',获取的时FactoryBean工厂类中的实例对象;
                                            如:上述的Apple类对象

                                        加 '&',获取的是 FactoryBean工厂类对象;
                                            如:上述的FactoryBean类对象myFactoryBean;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值