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 ...
随机推荐
- CSS行间样式与内部样式
注释 <!-- --> 快捷键 crtl+/ div 双标签<div></div> CSS语法 属性名:属性值: Css引入方式 1.行间样式的引入:在标签中 ...
- F5双机冗余配置
转自:https://blog.51cto.com/dynamic/769888本文作者:CTO_LiuJinFeng 1. 配置管理接口-IP 前面文章中没提到如何配置IP,现在开始来配置. 登录- ...
- C/C++源程序到可执行程序的过程
源程序.cpp 预处理得到 预处理文件.i 编译得到 汇编文件.S 汇编得到 目标文件.o 链接得到 可执行文件 例子:main.cpp fun.cpp fun.h #inclu ...
- Mybatis实现联合查询(六)
1. 疑问 在之前的章节中我们阐述了如何用Mybatis实现检查的查询,而我们实际的需求中,绝大部分查询都不只是针对单张数据表的简单查询,所以我们接下来要看一下Mybatis如何实现联合查询. 2. ...
- shell中获取文件目录方法
1.``:表示执行对应的命令,嵌套时使用`\`\``,注意\进行转义,同时执行多个命令时使用:隔开file=`cd "\`dirname $0\`";pwd`echo $file ...
- vue接口交互写死的
vue接口 写死的 RoleOfUserOrgRef: function ({ commit }, param) { return new Promise((resolve) => { $axi ...
- List中常用的linq操作
[Serializable] public class Product { public Product() { } public Product(string id,string pname,int ...
- jq监控滑动
$(window).scroll(function () { if ($(window).scrollTop() == $(document).height() - $(window).height( ...
- Split string every nth character?
https://stackoverflow.com/questions/9475241/split-string-every-nth-character >>> line = '12 ...
- 12)hInstance和hWnd写进子类
1)因为这些变量存在于 WInMaincpp文件中 但是 我想在我的CGameCtrl子类中要用到hInstance实例句柄和hWNd窗口句柄,那么 我就将这些变量在父类CGameCtrl中有一份 ...