前言

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

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

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

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

1.1 @Autowired

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

1
2
3
4
5
6
7
8
9
@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来标注名称,代码示例如下:

1
2
3
@Autwired
@Qualifier("beanName")
private BeanType beanObj;

应用范围: 变量, setter方法和构造函数之上。

来源: Spring框架

1.2 @Inject

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

应用范围: 变量、setter方法,构造函数

来源: JSR330规范 javax扩展包

代码示例:

1
2
3
@Inject
@Named("beanName")
private BeanType bean;

1.3 @Resource

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

应用范围:可以应用到变量和setter方法之上

来源: JDK 1.6之后提供

代码使用示例:

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

二、动态注入的方式

思路: 基于ApplicationContextAware来获取ApplicationContext的引用,然后基于ApplicationContext进行对象的动态获取。

实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@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实例了:

1
BeanType bean = SpringContextUtil.getBean("beanName")

是不是非常容易使用呢?

总结

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

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

原文链接:http://www.jianshu.com/p/c887a9f9ea42

Spring中如何动态注入Bean实例教程的更多相关文章

  1. 基于ImportBeanDefinitionRegistrar和FactoryBean动态注入Bean到Spring容器中

    基于ImportBeanDefinitionRegistrar和FactoryBean动态注入Bean到Spring容器中 一.背景 二.实现方案 1.基于@ComponentScan注解实现 2.基 ...

  2. Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean

    在阅读Spring Boot源码时,看到Spring Boot中大量使用ImportBeanDefinitionRegistrar来实现Bean的动态注入.它是Spring中一个强大的扩展接口.本篇文 ...

  3. spring boot 动态注入bean

    方法一 SpringContextUtil public class SpringContextUtil { private static ApplicationContext application ...

  4. Quartz 在 Spring 中如何动态配置时间--转

    原文地址:http://www.iteye.com/topic/399980 在项目中有一个需求,需要灵活配置调度任务时间,并能自由启动或停止调度. 有关调度的实现我就第一就想到了Quartz这个开源 ...

  5. Spring学习(三)——Spring中的依赖注入的方式

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  6. JavaEE开发之Spring中的依赖注入与AOP

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  7. JavaEE开发之Spring中的依赖注入与AOP编程

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  8. 谈谈Spring中的对象跟Bean,你知道Spring怎么创建对象的吗?

    本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 推荐阅读: Spring官网阅读 | 总结篇 Spring杂 ...

  9. 这篇文章,我们来谈一谈Spring中的属性注入

    本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring中的对象跟Bean,你知道Spring怎么创 ...

随机推荐

  1. 每日一招:如何才能在A股持续盈利?

    证券市场介入门槛低,是众多普通投资者希望实现自己的“中国梦”的首选场所,无论牛市熊市,源源不断的参与者前赴后继.在沪深A股这样一个大众市场,每年都在上演着七亏两平一赚的悲喜剧,赚钱的永远是少数人,但众 ...

  2. c# 获取毫秒值,时间戳

    获取时间戳(秒) (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000 获取时间戳(毫秒) (DateTime. ...

  3. 为什么jdbc中的resultset只能取一次去第二次就报错了

    引用 6 楼  的回复: 好吧各位,应该写getInt(1)但是我要问的是为什么第二次用会出错 啊,好古老的一个问题... 第二次出错的原因,是因为你创建Statement的时候,没有指定结果集(游标 ...

  4. 将Xcode升级到10.0以上版本,Appium启动报错的问题

    前言 现在的Xcode最新版本都是在10.1,原先使用的版本是9.4.1!结果今天手贱将其升级... 然后,跑IOS自动化时,出现“Xcode version '0.1'. Support for X ...

  5. erlang实现一个进程池 pool

    erlang的实现一个简单的进程池. erlang进程是非常轻量级的,这个进程池的主要目的是用一种通用的方式去管理和限制系统中运行的资源占用.当运行的工作者进程数量达到上限,进程池还可以把任务放到队列 ...

  6. 解决Mysql - can't get stat of (errcode:13)

    [1]线上环境问题 大清早来上班,被运维扔了一个错误日志截图,如下: Mysql 导入数据失败! [2]分析问题 记得如此类似的问题,好像已经都解决了.为啥又复现了呢?难道是自己上次没有考虑全场景?或 ...

  7. intellij idea pycharm phpstorm webstorm 使用 FiraCode 作为编程字体,更新后字符乱码问题解决

    先说使用下载 传送门 https://pan.baidu.com/s/1OI-novVYy-C74HIUfr9E6w windows: 1.下载后打开ttf文件夹,选择所有右键安装. 2.或者使用ch ...

  8. 信息搜集之google语法

    总结的比较全,无耻的转了.D: http://blog.csdn.net/chaosa/article/details/1828301 说起Google,可谓无人不知无人不晓.作为世界第一的搜索引擎, ...

  9. Java基础 - 输出

    输出在各个开发语言中起着至关重要的作用,方便编写代码时进行调试,在java中使用 System.out.println 进行输出 public class Main { public static v ...

  10. JS分段传输数据

    <SCRIPT language=javascript> file://数据拆分,并放到相应的hidden域中,在Form的onSubmit事件中激发 function fnPreHand ...