Spring中如何动态注入Bean实例教程
前言
在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的各种方式,各有优劣,大家可以选择使用。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
推荐阅读
-
Spring中如何动态注入Bean实例教程
-
动态设定Spring中bean的属性
-
动态设定Spring中bean的属性
-
如何获取spring mvc中的拦截器的bean
-
如何获取spring mvc中的拦截器的bean
-
如何保证spring bean中的线程安全
-
如何保证spring bean中的线程安全
-
web过滤器使用spring依赖注入 解决过滤器中不能注入bean的问题
-
spring中向一个单例bean中注入非单例bean的方法详解
-
spring配置文件(spring的开发步骤;bean中的scope,init-method,destroy-method;bean的工厂静态方法实例化;工厂动态方法实例化)