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

Spring中如何动态注入Bean实例教程

程序员文章站 2023-12-04 11:24:22
前言 在spring中提供了非常多的方式注入实例,但是由于在初始化顺序的不同,基于标注的注入方式,容易出现未被正确注入成功的情况。 本文将介绍一种在实际项目中基于动态的...

前言

在spring中提供了非常多的方式注入实例,但是由于在初始化顺序的不同,基于标注的注入方式,容易出现未被正确注入成功的情况。

本文将介绍一种在实际项目中基于动态的方式来提取spring管理的bean。 下面话不多说了,来一起看看详细的介绍吧。

一、基于标注的方式注入实例

需要在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)
@documentedpublic
@interface autowired {
/** * declares whether the annotated dependency is required. *
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;

二、动态注入的方式

思路: 基于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")

是不是非常容易使用呢?

总结

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

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。