当前位置:网站首页>Inject Autowired fields into ordinary beans
Inject Autowired fields into ordinary beans
2022-04-23 19:26:00 【justry_ deng】
To the ordinary bean Conduct Autowired Field injection
Tool class
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
import java.util.Objects;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
/** * To the ordinary bean( namely : Not spring-bean) Of autowired Injection support * * @author JustryDeng * @since 2020/7/5 13:20:19 */
@Slf4j
public abstract class ExtAutowiredInjector {
public ExtAutowiredInjector() {
Object obj = applyAutowired();
ExtAutowiredInjector.inject(obj);
}
/** * For returned object Conduct autowired Injection treatment * * @return To be injected Object */
protected Object applyAutowired() {
return this;
}
/** * On the target object @Auwired Annotated fields are injected * * @param obj * The goal is obj */
public static void inject(Object obj) {
if (obj == null) {
log.warn("obj is null, skip inject.");
return;
}
if (ExtAutowiredInjectorProcessor.applicationContext != null) {
ExtAutowiredInjectorProcessor.applicationContext.publishEvent(new AutowiredInjectEvent(obj));
} else {
ExtAutowiredInjectorProcessor.queue.add(obj);
}
}
/** * Autowired Inject support events * * @author JustryDeng * @since 2020/7/5 15:02:19 */
public static class AutowiredInjectEvent extends ApplicationEvent {
@Getter
private final Object bean;
/** * Create a new ApplicationEvent. * * @param source * the object on which the event initially occurred (never {@code null}) */
public AutowiredInjectEvent(Object source) {
super(source);
Objects.requireNonNull(source, "source cannot be null.");
this.bean = source;
}
}
/** * {@link ExtAutowiredInjector} processor * * @author JustryDeng * @since 2020/7/5 13:46:25 */
@Slf4j
@Component
public static class ExtAutowiredInjectorProcessor implements SmartInitializingSingleton, ApplicationListener<AutowiredInjectEvent> {
static ApplicationContext applicationContext;
static Queue<Object> queue = new ConcurrentLinkedQueue<>();
private final AutowireCapableBeanFactory autowireCapableBeanFactory;
public ExtAutowiredInjectorProcessor(AutowireCapableBeanFactory autowireCapableBeanFactory,
ApplicationContext applicationContext) {
this.autowireCapableBeanFactory = autowireCapableBeanFactory;
ExtAutowiredInjectorProcessor.applicationContext = applicationContext;
}
@Override
public void onApplicationEvent(@NonNull AutowiredInjectEvent event) {
Object bean = event.getBean();
autowireCapableBeanFactory.autowireBean(bean);
afterSingletonsInstantiated();
}
@Override
public void afterSingletonsInstantiated() {
Object obj = queue.poll();
while (obj != null) {
autowireCapableBeanFactory.autowireBean(obj);
obj = queue.poll();
}
}
}
}
Use tests
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Component;
/** * start class * * @author JustryDeng * @since 2022/4/21 11:41 */
@SpringBootApplication
public class DemoApplication implements ApplicationRunner {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
// start-up springboot project , Observe the input
// Test one , Output :hello Deng eryang ~
new TestClassOne().who();
// Test two , Output :hello Deng Shuai ~
TestClassTwo testClassTwo = new TestClassTwo();
ExtAutowiredInjector.inject(testClassTwo);
testClassTwo.who();
// It doesn't matter to inject repeatedly
//ExtAutowiredInjector.inject(testClassTwo);
//ExtAutowiredInjector.inject(testClassTwo);
//ExtAutowiredInjector.inject(testClassTwo);
//testClassTwo.who();
}
/** * Test usage I : To use by inheritance , Automatically complete the injection */
public static class TestClassOne extends ExtAutowiredInjector {
@Autowired
@Qualifier("demoApplication.DengErYang")
private Mine mine;
public void who() {
System.err.println(mine.hello());
}
@Override
protected Object applyAutowired() {
return this;
}
}
/** * Test usage I : No inheritance , Direct use {@link ExtAutowiredInjector#inject(Object)} Inject */
public static class TestClassTwo {
@Autowired
@Qualifier("demoApplication.DengShuai")
private Mine mine;
public void who() {
System.err.println(mine.hello());
}
}
public interface Mine {
String hello();
}
@Component(value = "demoApplication.DengErYang")
public static class DengErYang implements Mine {
@Override
public String hello() {
return "hello Deng eryang ~";
}
}
@Component(value = "demoApplication.DengShuai")
public static class DengShuai implements Mine {
@Override
public String hello() {
return "hello Deng Shuai ~";
}
}
}
Start the program , Console output :
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.6)
2022-04-21 13:47:39.176 INFO 15784 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication using Java 1.8.0_291 on DESKTOP-K08MNSB with PID 15784 (E:\working\demo\demo\target\classes started by Dunsullivan in E:\java\flex-server)
2022-04-21 13:47:39.179 INFO 15784 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to 1 default profile: "default"
2022-04-21 13:47:39.480 INFO 15784 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 0.509 seconds (JVM running for 0.9)
hello Deng eryang ~
hello Deng Shuai ~
Process finished with exit code 0
Related information
- This article has been included in 《 Programmer growth notes 》 , The author JustryDeng
版权声明
本文为[justry_ deng]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204231923567388.html
边栏推荐
- Using oes texture + glsurfaceview + JNI to realize player picture processing based on OpenGL es
- PostgreSQL
- 【webrtc】Add x264 encoder for CEF/Chromium
- Hot reload debugging
- 5 minutes to achieve wechat cloud applet payment function (including source code)
- How to use go code to compile Pb generated by proto file with protoc Compiler Go file
- 机器学习目录
- Regular expressions for judging positive integers
- Parsing headless jsonarray arrays
- Translation of audio signal processing and coding: Preface
猜你喜欢
Using oes texture + glsurfaceview + JNI to realize player picture processing based on OpenGL es
OpenHarmony开源开发者成长计划,寻找改变世界的开源新生力!
深度学习——特征工程小总结
An algorithm problem was encountered during the interview_ Find the mirrored word pairs in the dictionary
Garbage collector and memory allocation strategy
Deep learning -- Summary of Feature Engineering
精简CUDA教程——CUDA Driver API
山大网安靶场实验平台项目—个人记录(四)
The most detailed network counting experiment in history (2) -- rip experiment of layer 3 switch
An idea of rendering pipeline based on FBO
随机推荐
FFT物理意义: 1024点FFT就是1024个实数,实际进入fft的输入是1024个复数(虚部为0),输出也是1024个复数,有效的数据是前512个复数
指针数组与数组指针的区分
Transaction processing of SQL Server database
Quick start to static class variables
ArcMap connecting ArcGIS Server
Wechat applet part of the mobile phone Preview PDF did not respond
The most detailed network counting experiment in history (2) -- rip experiment of layer 3 switch
山大网安靶场实验平台项目-个人记录(五)
arcgis js api dojoConfig配置
Openlayers draw rectangle
Some ideas about time-consuming needs assessment
Prefer composition to inheritance
Matlab 2019 installation of deep learning toolbox model for googlenet network
Gossip: on greed
Steps to build a deep learning environment GPU
DevOps集成-Jenkins 服务的环境变量和构建工具 Tools
Executor、ExecutorService、Executors、ThreadPoolExecutor、Future、Runnable、Callable
视频理解-Video Understanding
MySQL syntax collation (3)
The difference between underline and dot of golang import package