当前位置:网站首页>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
- An idea of rendering pipeline based on FBO
- openlayers 5.0 离散聚合点
- 山大网安靶场实验平台项目—个人记录(四)
- 2021-2022-2 ACM training team weekly Programming Competition (8) problem solution
- SSDB Foundation
- 坐标转换WGS-84 转 GCJ-02 和 GCJ-02转WGS-84
- Some speculation about the decline of adults' language learning ability
- [报告] Microsoft :Application of deep learning methods in speech enhancement
- Strange passion
猜你喜欢
指针数组与数组指针的区分
@MapperScan与@Mapper
Prefer composition to inheritance
Deep learning -- Summary of Feature Engineering
An idea of rendering pipeline based on FBO
[transfer] summary of new features of js-es6 (one picture)
OpenHarmony开源开发者成长计划,寻找改变世界的开源新生力!
Use of fluent custom fonts and pictures
Zero base to build profit taking away CPS platform official account
No, some people can't do the National Day avatar applet (you can open the traffic master and earn pocket money)
随机推荐
MySQL syntax collation (2)
Application of DCT transform
Openlayers 5.0 loading ArcGIS Server slice service
On the forced conversion of C language pointer
Go modules daily use
Oracle配置st_geometry
TI DSP的 FFT与IFFT库函数的使用测试
How to uninstall easyton
I just want to leave a note for myself
A brief explanation of golang's keyword "competence"
SQL server requires to query the information of all employees with surname 'Wang'
Redis core technology and practice 1 - start with building a simple key value database simplekv
js上传文件时控制文件类型和大小
RuntimeError: Providing a bool or integral fill value without setting the optional `dtype` or `out`
Common processing of point cloud dataset
How to use go code to compile Pb generated by proto file with protoc Compiler Go file
MFCC: Mel频率倒谱系数计算感知频率和实际频率转换
Codeforces Round #784 (Div. 4)
Openlayers 5.0 reload the map when the map container size changes
Codeworks round 783 (Div. 2) d problem solution