bean加载与注入之重新理解
1、@Autowired注解不可以用在静态属性上;
解决方法:
使用实现了ApplicationContextAware接口的自定义工具类,ApplicationContextAware可以让我们获得spring的上下文对象ApplicationContext,通过ApplicationContext
的getBean方法可以获得指定类的Bean对象。举例如下:
@Component
public class contextTest implements ApplicationContextAware {
private static UserService userService;
private static UserService2 userService2;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
userService = applicationContext.getBean(UserService.class);
userService2 = applicationContext.getBean(UserService2.class);
}
}
// UserService
@Service
public class UserService {
public void test(){
System.out.println("UserService test executed...");
}
}
//UserService2
@Service
public class UserService2 {
public void test(){
System.out.println("UserService2 test executed...");
}
}
注:这里理解一下ApplicationContextAware接口的一种简单使用场景。
在非spring托管的类中 ,我们往往也需要引入spring IOC容器中的bean对象,然而在非spring托管的类中我们是不能使用@Autowired直接将bean对象引入。
由于实现ApplicationContextAware接口的类可以管理spring上下文ApplicationContext,从ApplicationContext中我们就可以得到IOC容器中的bean对象,如此
我们在非spring托管的类中只需要继承这个类就可以得到这些bean对象的使用。下面是一个完整的例子:
UserService 和 UserService2这两个类如上面所示;
//实现ApplicationContextAware接口的类
@Component
public class contextTest implements ApplicationContextAware {
private static UserService userService;
private static UserService2 userService2;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
userService = applicationContext.getBean(UserService.class);
userService2 = applicationContext.getBean(UserService2.class);
}
public static UserService getUserService() {
return userService;
}
public static UserService2 getUserService2() {
return userService2;
}
}
public class BaseContextTest {
protected UserService userService = contextTest.getUserService();
protected UserService2 userService2 = contextTest.getUserService2();
}
对于非spring托管的类,想使用被spring托管的userService和userService2,只需要继承BaseContextTest就可以使用了。
- 使用@autowired 标签进行set方法注入
@Component
public class contextTest {
private static UserService userService;
@Autowired
public void setUserService(UserService userService){
contextTest.userService = userService;
System.out.println(userService);
}
}
2、@Autowired使用
若被注解的类对象在IOC中还不存在,则需要临时将该类加载到IOC中,加载完成之后再将bean对象注入;
若IOC中已经存在该Bean,则只需要注入bean即可;
3、bean的加载和注入是两种不同的过程:
加载是将被spring托管的类变成IOC容器中的bean的过程
注入是将IOC容器中的bean对象赋给其它变量的过程
被@Controller、@Service、@Component等注解的类在springboot启动时会将这些类加载到IOC容器中。
如有错误之处,请不吝赐教。
参考博文:https://blog.csdn.net/lazy_zzzzzz/article/details/87814603
bean加载与注入之重新理解的更多相关文章
- Spring源码分析:Bean加载流程概览及配置文件读取
很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...
- 【spring】bean加载顺序
问题来源 有一个bean为A,一个bean为B.想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值. 如果只是在A里单纯的写着: private B b; private S ...
- SpringBoot系列教程之Bean加载顺序之错误使用姿势辟谣
在网上查询 Bean 的加载顺序时,看到了大量的文章中使用@Order注解的方式来控制 bean 的加载顺序,不知道写这些的博文的同学自己有没有实际的验证过,本文希望通过指出这些错误的使用姿势,让观文 ...
- SpringBoot中的bean加载顺序
https://www.dazhuanlan.com/2019/10/22/5daebc5d16429/ 最近在做传统Spring项目到SpringBoot项目迁移过程中,遇到了一些bean加载顺序的 ...
- spring源码阅读笔记06:bean加载之准备创建bean
上文中我们学习了bean加载的整个过程,我们知道从spring容器中获取单例bean时会先从缓存尝试获取,如果缓存中不存在已经加载的单例bean就需要从头开始bean的创建,而bean的创建过程是非常 ...
- XmlBeanFactory的Bean加载
如何使用这些bean,bean加载的探索: MyTestBean bean=(MyTestBean) bf.getBean("myTestBean"); AbstractBeanF ...
- 【Spring源码分析】Bean加载流程概览
代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...
- 【Spring源码分析】Bean加载流程概览(转)
转载自:https://www.cnblogs.com/xrq730/p/6285358.html 代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. ...
- springboot由于bean加载顺序导致的问题
先记录现象: dubbo整合zipkin时,我的配置文件是这样的 @Bean("okHttpSender") public OkHttpSenderFactoryBean okHt ...
随机推荐
- 81.常用的返回QuerySet对象的方法使用详解:values和values_list
values: 指定提取的数据库表中的字段值,如果不指定任何的字段名的话,默认情况下会提取所有的字段值.但是需要注意的是使用values返回的QuerySet对象中包括的是一个个的字典. 1.提取与A ...
- 刷题32. Longest Valid Parentheses
一.题目说明 题目是32. Longest Valid Parentheses,求最大匹配的括号长度.题目的难度是Hard 二.我的做题方法 简单理解了一下,用栈就可以实现.实际上是我考虑简单了,经过 ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习: 闭包
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- MySQL性能管理及架构设计:第1章 实例和故事
1-1 什么决定了电商双11大促的成败 数据库架构 1-2 在双11大促中的数据库服务器 通过监控信息从而确定:哪些因素影响了数据库性能? 1-3 在大促中什么影响了数据库性能 1-4 大表带来的问题 ...
- UML-架构分析-基础
1.何时开始架构分析? 最好在第一次迭代前开始.因为,架构分析的失败会导致高风险.如:必须支持英语.在一秒响应时间内支持500个并发事务. UP是迭代和进化的(不是瀑布式的),所以架构分析和开发工作齐 ...
- 面试准备 css 书写顺序及原理
书写顺序 (1)定位属性:position display float left top right bottom overflow clear z-index (2)自身属性: ...
- c++语法(2)
#include<iostream> #include<windows.h> using namespace std; class Parents { public: virt ...
- Python 学习笔记:根据输入年月获取该月的第一天和最后一天
目的: 给定一个时间,比如:2020.02,要求返回所输入月份的第一天及最后一天,比如:('2020.02.01', '2020.02.29') 参考博客:https://blog.csdn.net/ ...
- 决策树分类回归,ID3,c4.5,CART,及其Python代码
决策树模型 内部节点表示一个特征或者属性,叶子结点表示一个类.决策树工作时,从根节点开始,对实例的每个特征进行测试,根据测试结果,将实例分配到其子节点中,这时的每一个子节点对应着特征的一个取值,如此递 ...
- gcc -l:手动添加链接库
链接器把多个二进制的目标文件(object file)链接成一个单独的可执行文件.在链接过程中,它必须把符号(变量名.函数名等一些列标识符)用对应的数据的内存地址(变量地址.函数地址等)替代,以完成程 ...