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前边加一个&如上边代码示例
    

你可能感兴趣的:(spring系列,spring,java)