当前位置:网站首页>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
边栏推荐
- Openlayers 5.0 discrete aggregation points
- Redis optimization series (III) solve common problems after master-slave configuration
- Speculation on the way to realize the smooth drag preview of video editing software
- How to use go code to compile Pb generated by proto file with protoc Compiler Go file
- JS controls the file type and size when uploading files
- No, some people can't do the National Day avatar applet (you can open the traffic master and earn pocket money)
- openlayers draw矩形
- IIS数据转换问题16bit转24bit
- How to uninstall easyton
- PostgreSQL
猜你喜欢
命令-sudo
精简CUDA教程——CUDA Driver API
RuntimeError: Providing a bool or integral fill value without setting the optional `dtype` or `out`
Class loading mechanism
JVM的类加载过程
山大网安靶场实验平台项目-个人记录(五)
The most detailed network counting experiment in history (2) -- rip experiment of layer 3 switch
[report] Microsoft: application of deep learning methods in speech enhancement
Lottery applet, mother no longer have to worry about who does the dishes (assign tasks), so easy
Audio signal processing and coding - 2.5.3 the discrete cosine transform
随机推荐
[报告] Microsoft :Application of deep learning methods in speech enhancement
An idea of rendering pipeline based on FBO
UML类图几种关系的总结
ArcMap connecting ArcGIS Server
Speex维纳滤波与超几何分布的改写
高效的串口循环Buffer接收处理思路及代码2
MySQL syntax collation
js上传文件时控制文件类型和大小
SSDB foundation 2
Golang timer
SQL Server database in clause and exists clause conversion
山大网安靶场实验平台项目—个人记录(四)
Common processing of point cloud dataset
Codeforces Round #784 (Div. 4)
openlayers draw矩形
Redis core technology and practice 1 - start with building a simple key value database simplekv
No, some people can't do the National Day avatar applet (you can open the traffic master and earn pocket money)
arcMap 发布切片服务
How to use go code to compile Pb generated by proto file with protoc Compiler Go file
MySQL syntax collation (3)