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 ...
随机推荐
- 【收藏】免费开源好看的bootstrap后台模板
1.ace admin github:https://github.com/bopoda/acedemo:http://ace.jeka.by/ 2.CoreUI jQuery.Angular.Rea ...
- PHP+InfiniteScroll实现网页无限滚动加载数据实例
PHP+InfiniteScroll实现网页无限滚动加载数据实例,实现原理:当滚动条到底离网页底部一定长度的时候,向后台发送页数并获取数据. 首先我们在页面上先放置10条数据,即第一页,每一项都是p标 ...
- Go语言-并发模式-资源池实例(pool)
Go语言并发模式 利用goroutine和channel进行go的并发模式,实现一个资源池实例(<Go语言实战>书中实例稍作修改) 资源池可以存储一定数量的资源,用户程序从资源池获取资源进 ...
- 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 A题
A - ^&^ Bit operation is a common computing method in computer science ,Now we have two positive ...
- A - Color the ball HDU - 1556 (差分数组+前缀和)
思路等引自博客 https://blog.csdn.net/johnwayne0317/article/details/84928568 对数组a[7]: a[0]=1; = d[0] a[1]=1; ...
- 201771010123汪慧和《面向对象程序设计JAVA》第八周实验总结
一.理论部分 1.接口 用interface声明,是抽象方法和常量值定义的集 合.从本质上讲,接口是一种特殊的抽象类. 在Java程序设计语言中,接口不是类,而是对类 的一组需求描述,由常量和一组抽象 ...
- 视图家族之视图工具集viewsets
视图家族之视图工具集viewsets 一.视图集ViewSet 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 cr ...
- Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数
1. 概述: 我们在前面用了很多的装饰器这个工具的方法.这个位置要系统的讲一下装饰器. 1.2 为什么需要装饰器. 装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额 ...
- Python—后台运行(nohup 、&、 2>&1详解)
一.脚本文件(test.py) # -*- coding: UTF-8 -*- import time print("hello"," python") os. ...
- Maven高级:01.maven分模块构建&&02.私服的应用
IntelliJ IDEA 2018.3.6 x64 07 Maven高级:01.maven分模块构建(上) 07 Maven高级:01.maven分模块构建(中) 07 Maven高级:01.mav ...