动态注入Spring中的Bean实例快速指南

引言: 在Spring中提供了非常多的方式注入实例,但是由于在初始化顺序的不同,基于标注的注入方式,都是静态方式的。在实际项目中,需要一种动态的方式来提取Spring管理的Bean,本文将介绍这样一种方式。

1 基于注入的方式

此类方式注入需要在Bean初始化之时,其依赖的对象必须初始化完毕。如果被注入的对象初始化晚于当前对象,则注入的对象将为null.

1.1 @Autowired

按照类型来加载Spring管理的Bean。默认情况下要求其Bean必须存在。 如果其Bean为null,则可以设置其required属性为false。 具体的详情,可以参照源代码:

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {

    /**
     * Declares whether the annotated dependency is required.
     * <p>Defaults to {@code true}.
     */
    boolean required() default true;
}

如果需要基于命令来注入Bean,则需要使用@Qualifier来标注名称,代码示例如下:

@Autwired
@Qualifier("beanName")
private BeanType beanObj;

应用范围: 变量, setter方法和构造函数之上。 来源: Spring框架

1.2 @Inject

由javax.inject.Inject提供,基于类型进行自动装配,如果需要按照名称进行转配,则需要配合使用@Named。这个使用方式和Spring框架提供的@Autowired非常类似。

应用范围: 变量、setter方法,构造函数 来源: JSR330规范 javax扩展包
代码示例:

  @Inject
   @Named("beanName")
   private BeanType bean;

1.3 @Resource

默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。其有JDK 1.6之后提供的。

应用范围:可以应用到变量和setter方法之上 来源: JDK 1.6之后提供

代码使用示例:

@Resource(name="mybeanName")
private BeanType bean;

2. 动态注入的方式

思路: 基于ApplicationContextAware来获取ApplicationContext的引用,然后基于ApplicationContext进行对象的动态获取。
实现代码如下:

@Component
    public class SpringContextUtil implements ApplicationContextAware {  
        // Spring应用上下文环境  
        private static ApplicationContext applicationContext;  
        /** 
         * 实现ApplicationContextAware接口的回调方法,设置上下文环境 
         *  
         * @param applicationContext 
         */  
        public void setApplicationContext(ApplicationContext applicationContext) {  
            SpringContextUtil.applicationContext = applicationContext;  
        }  
        /** 
         * @return ApplicationContext 
         */  
        public static ApplicationContext getApplicationContext() {  
            return applicationContext;  
        }  
        /** 
         * 获取对象 
         *  
         * @param name 
         * @return Object
         * @throws BeansException 
         */  
        public static Object getBean(String name) throws BeansException {  
            return applicationContext.getBean(name);  
        }  
    }

之后就可以直接在代码中动态获取所需要的Bean实例了:

BeanType bean = SpringContextUtil.getBean(“beanName”)

是不是非常容易使用呢?

3 总结

这里总结了在Spring中注入Bean的各种方式,各有优劣,大家可以选择使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值