欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

向Spring容器中注册组件的方法汇总小结

程序员文章站 2023-11-24 22:11:34
1、通过xml定义 2、通过注解 这种方式比较常见,通常用@Controller、@Component、@Service等等 3、通过@Bean注解 比如下面的代码往容器中注册一个Person对象 默认情况下,使用方法【person()】名person作为Person对象的注册id 也可以通过修改方 ......
1、通过xml定义
<bean class="">
    <property name="" value=""></property>
</bean>
2、通过注解

这种方式比较常见,通常用@controller、@component、@service等等

3、通过@bean注解

比如下面的代码往容器中注册一个person对象

@bean
public person person(){
    return new person("张三", 20);
}

默认情况下,使用方法【person()】名person作为person对象的注册id
也可以通过修改方法名或者使用@bean(“custombeanname”)

4、通过实现factorybean接口
public interface factorybean<t> {
    t getobject() throws exception;
    class<?> getobjecttype();
    boolean issingleton();
}

// sample
public class personfactorybean implements factorybean<person> {
    ....
}

实现上述接口的3个方法,并把personfactorybean注册到容器中,就可以把person也注册到容器中。
具体创建person过程的源码可以看factorybeanregistrysupport#getobjectfromfactorybean方法。

// 如下代码拿到的是person对象
applicationcontext.getbean("personfactorybean")

// 如果想要拿到personfactorybean对象,可以再前面加&
applicationcontext.getbean("&personfactorybean")
5、通过@import注解

先来看看源码:

@target(elementtype.type)
@retention(retentionpolicy.runtime)
@documented
public @interface import {
    /**
    * {@link configuration}, {@link importselector}, {@link importbeandefinitionregistrar}
    * or regular component classes to import.
    */
    class<?>[] value();
}

源码注释写的也很清楚,可以引入 配置类、importselector、importbeandefinitionregistrar,甚至是普通class。 通过@import,我们可以使用如下方式注册组件:

@import({person.class, myimportselector.class,myimportbeandefinitionregistrar.class})

其中:

  • myimportselector实现了importselector接口,selectimports方法返回类全名的string[]都会被注册到容器中

  • myimportbeandefinitionregistrar实现了importbeandefinitionregistrar接口

    // sample
    public class myimportbeandefinitionregistrar implements importbeandefinitionregistrar {
    @override
    public void registerbeandefinitions(annotationmetadata importingclassmetadata, beandefinitionregistry registry) {
        // 指定bean定义信息
        rootbeandefinition beandefinition = new rootbeandefinition(person.class);
        // 注册一个bean,指定bean名
        registry.registerbeandefinition("person", beandefinition);
      }
    }

这是一个非常重要的注解,在spring源码中,哪哪都能看到他的身影。

  • 如 @enableaspectjautoproxy注解

    @target(elementtype.type)
    @retention(retentionpolicy.runtime)
    @documented
    @import(aspectjautoproxyregistrar.class)
    public @interface enableaspectjautoproxy {
        ...
    }

    enableaspectjautoproxy通过@import引入了aspectjautoproxyregistrar类[实现了 importbeandefinitionregistrar],这个registrar里面又会向spring容器中注册annotationawareaspectjautoproxycreator(spring aop注解实现的功臣)。

  • 如 @enablewebmvc注解。通过import引入的是一个配置类

    @retention(retentionpolicy.runtime)
    @target(elementtype.type)
    @documented
    @import(delegatingwebmvcconfiguration.class)
    public @interface enablewebmvc {
    }
  • 如 @enableasync注解。通过import引入的是asyncconfigurationselector[实现了importselector接口]

    @target(elementtype.type)
    @retention(retentionpolicy.runtime)
    @documented
    @import(asyncconfigurationselector.class)
    public @interface enableasync {
        ...
    }