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 ...
随机推荐
- js冒泡,阻止冒泡
js 冒泡事件 阻止冒泡 window.onload = function () { var oDiv1 = document.getElementById('div1'); var oDiv2 = ...
- EF Core开发模式之Code First
Code First顾名思义,代码为先.首先编写完相关的实体类及DbContext派生类,然后通过映射关系自动在数据库中完成数据库表的创建. 本例中创建一个班级和学生的管理,主要有班级类MyClass ...
- centos通过yum安装php
1.添加php的yum软件仓库 sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm 2.安装php相关软件,执行过程中全部选择ye ...
- vmbox 导入虚拟电脑之后无法上网
先执行 ip addr 查看有没有分配ip 用root执行dhclient -v命令去通过DHCP协议获取一个ip,在下图的最后一行可以看到ip已经分配成功dhclient命令可以用来释放你的电脑的I ...
- 【数据结构】Hash表简介及leetcode两数之和python实现
文章目录 Hash表简介 基本思想 建立步骤 问题 Hash表实现 Hash函数构造 冲突处理方法 leetcode两数之和python实现 题目描述 基于Hash思想的实现 Hash表简介 基本思想 ...
- Jenkins 插件中心国内镜像源发布
以下文章来源于Jenkins,作者LinuxSuRen Jenkins 社区的网络基础设施都是架设在国外的服务器上,而且,并没有在国内有 CDN 或者负载均衡的配置.对所有的 Jenkins 用户而言 ...
- 72)MFC测试动态共享库
动态共享库: 首先我建立一个新的动态库: 然后不选择空项目了,因为我们普通的cpp文件 入口是main win32入口是winmain 那么这个动态库的入口在哪里 我们就是为了看一看: 出来这样 ...
- windows下MariaDB忘记密码找回
1.首先停止数据库 2.找到my.ini文件 3.右键以记事本打开在Mysqld下添加如下一行保存,然后启动数据库 4.登录数据库会提示输入密码,默认回车即可 5.退出数据库,删除我们上面在my.in ...
- Springmvc接收数组参数
Springmvc接收数组参数,必须添加@RequestParam注解 注解格式@RequestParam(value="前端参数名[]") 示例: controller端的代码 ...
- 计蒜客 王子救公主(DFS)
一天,蒜头君梦见自己当上了王子,但是不幸的是,自己的公主被可恶的巫婆抓走了.于是蒜头君动用全国的力量得知,自己的公主被巫婆抓进一个迷宫里面.由于全国只有蒜头君自己可以翻越迷宫外的城墙,蒜头君便自己一人 ...