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加载与注入之重新理解的更多相关文章

  1. Spring源码分析:Bean加载流程概览及配置文件读取

    很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已 ...

  2. 【spring】bean加载顺序

    问题来源 有一个bean为A,一个bean为B.想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值. 如果只是在A里单纯的写着: private B b; private S ...

  3. SpringBoot系列教程之Bean加载顺序之错误使用姿势辟谣

    在网上查询 Bean 的加载顺序时,看到了大量的文章中使用@Order注解的方式来控制 bean 的加载顺序,不知道写这些的博文的同学自己有没有实际的验证过,本文希望通过指出这些错误的使用姿势,让观文 ...

  4. SpringBoot中的bean加载顺序

    https://www.dazhuanlan.com/2019/10/22/5daebc5d16429/ 最近在做传统Spring项目到SpringBoot项目迁移过程中,遇到了一些bean加载顺序的 ...

  5. spring源码阅读笔记06:bean加载之准备创建bean

    上文中我们学习了bean加载的整个过程,我们知道从spring容器中获取单例bean时会先从缓存尝试获取,如果缓存中不存在已经加载的单例bean就需要从头开始bean的创建,而bean的创建过程是非常 ...

  6. XmlBeanFactory的Bean加载

    如何使用这些bean,bean加载的探索: MyTestBean bean=(MyTestBean) bf.getBean("myTestBean"); AbstractBeanF ...

  7. 【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

  8. 【Spring源码分析】Bean加载流程概览(转)

    转载自:https://www.cnblogs.com/xrq730/p/6285358.html 代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. ...

  9. springboot由于bean加载顺序导致的问题

    先记录现象: dubbo整合zipkin时,我的配置文件是这样的 @Bean("okHttpSender") public OkHttpSenderFactoryBean okHt ...

随机推荐

  1. CSS行间样式与内部样式

    注释 <!-- --> 快捷键 crtl+/ div 双标签<div></div> CSS语法    属性名:属性值: Css引入方式 1.行间样式的引入:在标签中 ...

  2. F5双机冗余配置

    转自:https://blog.51cto.com/dynamic/769888本文作者:CTO_LiuJinFeng 1. 配置管理接口-IP 前面文章中没提到如何配置IP,现在开始来配置. 登录- ...

  3. C/C++源程序到可执行程序的过程

    源程序.cpp  预处理得到 预处理文件.i   编译得到 汇编文件.S    汇编得到 目标文件.o     链接得到 可执行文件 例子:main.cpp  fun.cpp fun.h #inclu ...

  4. Mybatis实现联合查询(六)

    1. 疑问 在之前的章节中我们阐述了如何用Mybatis实现检查的查询,而我们实际的需求中,绝大部分查询都不只是针对单张数据表的简单查询,所以我们接下来要看一下Mybatis如何实现联合查询. 2. ...

  5. shell中获取文件目录方法

    1.``:表示执行对应的命令,嵌套时使用`\`\``,注意\进行转义,同时执行多个命令时使用:隔开file=`cd "\`dirname $0\`";pwd`echo $file ...

  6. vue接口交互写死的

    vue接口 写死的 RoleOfUserOrgRef: function ({ commit }, param) { return new Promise((resolve) => { $axi ...

  7. List中常用的linq操作

    [Serializable] public class Product { public Product() { } public Product(string id,string pname,int ...

  8. jq监控滑动

    $(window).scroll(function () { if ($(window).scrollTop() == $(document).height() - $(window).height( ...

  9. Split string every nth character?

    https://stackoverflow.com/questions/9475241/split-string-every-nth-character >>> line = '12 ...

  10. 12)hInstance和hWnd写进子类

    1)因为这些变量存在于 WInMaincpp文件中  但是  我想在我的CGameCtrl子类中要用到hInstance实例句柄和hWNd窗口句柄,那么 我就将这些变量在父类CGameCtrl中有一份 ...