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

最新文章

  1. JavaScript:数组大全
  2. 基于 Ubuntu 编译 windows 版 adb
  3. (5)分布式下的爬虫Scrapy应该如何做-windows下的redis的安装与配置
  4. 什么是谷歌loon计划
  5. 重温CSS之背景、文本样式
  6. Ubuntu/Deepin下常用软件汇总(持续更新)
  7. 36个炫丽的html5 canvas展示
  8. SharePoint咨询师之路:设计之前的那些事三:体系结构
  9. 分布式PostGIS系列【2】——pgpool-II
  10. Environment variable:"PATH" 状态 失败
  11. css学习之color: window和color: currentColor
  12. javascript第十五课:DOM
  13. 笔记 postgresql oid同步
  14. oschina 手机/移动开发
  15. 数位dp——hud3652
  16. ViewPager无限轮播与自定义切换动画
  17. 分享几个写 demo 的思路
  18. Linux下获取java堆栈文件并进行分析
  19. 【codeforces 175D】 Plane of Tanks: Duel
  20. testNG中dataprovider使用的两种方式

热门文章

  1. 目录服务不能与此服务器复制,因为距上一次与此服务器复制的时间已经超过了 tombstone 生存时间。
  2. 吴裕雄--天生自然 JAVASCRIPT开发学习:函数参数
  3. AI 领域与概述
  4. Linux--Shell传递参数
  5. CMake命令之install
  6. php 使用redis队列简单实用
  7. NodeJS框架一览
  8. UML-FURPS+与补充性规格说明
  9. LGOJ4172 WC2006水管局长
  10. Django-rest framework框架的三大认证组件