向Spring容器中注册组件的方法汇总小结
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 { ... }