spring全注解-组件注册

  • @configuration 配置类==配置文件 高速spring这是一个配置文件

  • @bean 给容器中注册一个bean;类型为返回值的类型,id默认是用方法名字作为id

  • @componentScan 来指定包扫描同样的可以和xml中一样增加过滤规则

    @ComponentScan(value = "com.cxf",excludeFilters = {
            @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class})
    })
    @ComponentScan(value="com.cxf",includeFilters = {
            @ComponentScan.Filter(type = FilterType.ANNOTATION,classes ={Service.class})
    })
    
  • ioc组件中的实例默认都是单实例的,我们可以通过@Scope来改变,prototype多实例的,singleton即单例,默认单实例,容器启动时就会直接创建,如果是多实例,在使用时才会去创建对象

  • 单实例bean默认是容器启动的时候就创建对象,懒加载,及容器启动的时候不会创建对象,使用时才会创建使用 @lazy

  • 按照条件给容器中注册bean @conitional({conditon}) 按照一定的条件进行判断,满足条件给容器中注册bean

    1. 可以加在方法上也可以加在类上
    2. 加在方法上
public class linuxCondition implements Condition {
    //参数含义分别为判断条件能使用的上下文   及   注释信息
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        //TODO:获取bean工厂
        ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
        //TODO:获取类加载器
        ClassLoader classLoader = conditionContext.getClassLoader();
        //TODO:获取bean的定义信息
        BeanDefinitionRegistry registry = conditionContext.getRegistry();
        //TODO:获取环境变量
        Environment environment = conditionContext.getEnvironment();
        return environment.getProperty("os.name").contains("linux");
    }
}

        @Bean("linux")
        @Conditional({linuxCondition.class})
    public person test2(){
        return new person("linux",10);
        }
  • 给容器中注册组件

    1. 包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类]

    2. @bean 导入的第三方包里面的组件

    3. @import[快速的给容器中导入组件] 导入组件id默认是组件的全限定类名

      1.@Import({com.cxf.test.bean.color.class})  容器中就会直接注册这个组件;
      2.ImportSelector:返回需要导入的组件的全类名数组
          @Import({MyImportSelector.class})//配置类要加的注解
          
          public class MyImportSelector implements ImportSelector {
          //返回值,就是导入到容器中的组件的全类名数组
          //AnnotationMetadata  当前标注@import注解的类的所有注解的信息
          public String[] selectImports(AnnotationMetadata annotationMetadata) {
      
              //方法不要返回null值
              String[] arr={"com.cxf.test.bean.feifei"};
              return arr;
          }
      }
      3.ImportBeanDefinitionRegistrar
          @Import({MyImportSelector.class})//配置类要加的注解
          public class MyImportSelector implements ImportBeanDefinitionRegistrar {
          public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
              boolean windows = registry.containsBeanDefinition("windows");
              boolean config = registry.containsBeanDefinition("config");
              if(windows&& config){
                  //指定bean的定义信息\
                  //创建beandefinition
                  RootBeanDefinition beanDefinition=new RootBeanDefinition();
                  //设置全路径类名
                  beanDefinition.setBeanClass(com.cxf.test.bean.dog.class);
                  //设置scope
                  beanDefinition.setScope("singleton");
                  //注册beandefinition
                  registry.registerBeanDefinition("chenfeifei",beanDefinition);
              }
          }
      }
      
  • 使用springbean进行组件注册(工厂bean)

    @Import({MyFactoryBean.class})//容器中的id为工厂的全类名,但是实际类型还是生产的类型
    public class MyFactoryBean implements FactoryBean<feifeizhu> {
        public feifeizhu getObject() throws Exception {
            return new feifeizhu();
        }
        public Class<?> getObjectType() {
            return feifeizhu.class;
        }
        /**
         * TODO:是单例?
         * true:这个bean是单实例,在容器中保存一份
         * false:这个bean是多实例,每次获取都会创建一个
         * @return
         */
        public boolean isSingleton() {
            return true;
        }
    }
    
            Object bean = context.getBean("&com.cxf.test.condition.MyFactoryBean");
            System.out.println(bean.getClass());
    1.默认获取到的是工厂bean调用getobject()创建的对象
    2.要获取工厂bean本身,我们需要给id前边加一个&如上边代码示例
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quare_feifei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值