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