可以看到,我们课上讲的,都是 BeanFactory 提供的基本功能,ApplicationContext 中的扩展功能都没有用到。
com.libin.a01 包
通过这个示例结合 debug 查看 ApplicationContext 对象的内部结构,学到:
建议练习:完成用户注册与发送短信之间的解耦,用事件方式、和 AOP 方式分别实现
注意
public class TestMessageSource {
public static void main(String[] args) {
GenericApplicationContext context = new GenericApplicationContext();
context.registerBean("messageSource", MessageSource.class, () -> {
ResourceBundleMessageSource ms = new ResourceBundleMessageSource();
ms.setDefaultEncoding("utf-8");
ms.setBasename("messages");
return ms;
});
context.refresh();
System.out.println(context.getMessage("hi", null, Locale.ENGLISH));
System.out.println(context.getMessage("hi", null, Locale.CHINESE));
System.out.println(context.getMessage("hi", null, Locale.JAPANESE));
}
}
国际化文件均在 src/resources 目录下
messages.properties(空)
messages_en.properties
hi=Hello
messages_ja.properties
hi=こんにちは
messages_zh.properties
hi=你好
注意
Spring 的发展历史较为悠久,因此很多资料还在讲解它较旧的实现,这里出于怀旧的原因,把它们都列出来,供大家参考
另外要注意的是,后面这些带有 ApplicationContext 的类都是 ApplicationContext 接口的实现,但它们是组合了 DefaultListableBeanFactory 的功能,并非继承而来
com.libin.a02.TestBeanFactory
com.libin.a02.A02
一个受 Spring 管理的 bean,生命周期主要阶段有
一些资料会提到,生命周期中还有一类 bean 后处理器:BeanPostProcessor,会在 bean 的初始化的前后,提供一些扩展逻辑。但这种说法是不完整的,见下面的演示1
com.libin.a03 包
#mermaid-svg-u1SRT2f1M21YusjB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-u1SRT2f1M21YusjB .error-icon{fill:#552222;}#mermaid-svg-u1SRT2f1M21YusjB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-u1SRT2f1M21YusjB .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-u1SRT2f1M21YusjB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-u1SRT2f1M21YusjB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-u1SRT2f1M21YusjB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-u1SRT2f1M21YusjB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-u1SRT2f1M21YusjB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-u1SRT2f1M21YusjB .marker.cross{stroke:#333333;}#mermaid-svg-u1SRT2f1M21YusjB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-u1SRT2f1M21YusjB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-u1SRT2f1M21YusjB .cluster-label text{fill:#333;}#mermaid-svg-u1SRT2f1M21YusjB .cluster-label span{color:#333;}#mermaid-svg-u1SRT2f1M21YusjB .label text,#mermaid-svg-u1SRT2f1M21YusjB span{fill:#333;color:#333;}#mermaid-svg-u1SRT2f1M21YusjB .node rect,#mermaid-svg-u1SRT2f1M21YusjB .node circle,#mermaid-svg-u1SRT2f1M21YusjB .node ellipse,#mermaid-svg-u1SRT2f1M21YusjB .node polygon,#mermaid-svg-u1SRT2f1M21YusjB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-u1SRT2f1M21YusjB .node .label{text-align:center;}#mermaid-svg-u1SRT2f1M21YusjB .node.clickable{cursor:pointer;}#mermaid-svg-u1SRT2f1M21YusjB .arrowheadPath{fill:#333333;}#mermaid-svg-u1SRT2f1M21YusjB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-u1SRT2f1M21YusjB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-u1SRT2f1M21YusjB .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-u1SRT2f1M21YusjB .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-u1SRT2f1M21YusjB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-u1SRT2f1M21YusjB .cluster text{fill:#333;}#mermaid-svg-u1SRT2f1M21YusjB .cluster span{color:#333;}#mermaid-svg-u1SRT2f1M21YusjB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-u1SRT2f1M21YusjB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
创建
依赖注入
初始化
可用
销毁
创建前后的增强
依赖注入前的增强
初始化前后的增强
销毁之前的增强
public class TestMethodTemplate {
public static void main(String[] args) {
MyBeanFactory beanFactory = new MyBeanFactory();
beanFactory.addBeanPostProcessor(bean -> System.out.println("解析 @Autowired"));
beanFactory.addBeanPostProcessor(bean -> System.out.println("解析 @Resource"));
beanFactory.getBean();
}
// 模板方法 Template Method Pattern
static class MyBeanFactory {
public Object getBean() {
Object bean = new Object();
System.out.println("构造 " + bean);
System.out.println("依赖注入 " + bean); // @Autowired, @Resource
for (BeanPostProcessor processor : processors) {
processor.inject(bean);
}
System.out.println("初始化 " + bean);
return bean;
}
private List<BeanPostProcessor> processors = new ArrayList<>();
public void addBeanPostProcessor(BeanPostProcessor processor) {
processors.add(processor);
}
}
static interface BeanPostProcessor {
public void inject(Object bean); // 对依赖注入阶段的扩展
}
}
com.libin.a03.TestProcessOrder
com.libin.a04 包
com.libin.a04.DigInAutowired
com.libin.a05 包
com.libin.a05.ComponentScanPostProcessor
com.libin.a05.AtBeanPostProcessor
com.libin.a05.MapperPostProcessor
com.libin.a06 包
Java 配置类不包含 BeanFactoryPostProcessor 的情况
#mermaid-svg-VNPO0ZltAj98JfP4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VNPO0ZltAj98JfP4 .error-icon{fill:#552222;}#mermaid-svg-VNPO0ZltAj98JfP4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VNPO0ZltAj98JfP4 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-VNPO0ZltAj98JfP4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VNPO0ZltAj98JfP4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VNPO0ZltAj98JfP4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VNPO0ZltAj98JfP4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VNPO0ZltAj98JfP4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VNPO0ZltAj98JfP4 .marker.cross{stroke:#333333;}#mermaid-svg-VNPO0ZltAj98JfP4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VNPO0ZltAj98JfP4 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VNPO0ZltAj98JfP4 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-VNPO0ZltAj98JfP4 .actor-line{stroke:grey;}#mermaid-svg-VNPO0ZltAj98JfP4 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-VNPO0ZltAj98JfP4 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-VNPO0ZltAj98JfP4 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-VNPO0ZltAj98JfP4 .sequenceNumber{fill:white;}#mermaid-svg-VNPO0ZltAj98JfP4 #sequencenumber{fill:#333;}#mermaid-svg-VNPO0ZltAj98JfP4 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-VNPO0ZltAj98JfP4 .messageText{fill:#333;stroke:#333;}#mermaid-svg-VNPO0ZltAj98JfP4 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VNPO0ZltAj98JfP4 .labelText,#mermaid-svg-VNPO0ZltAj98JfP4 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-VNPO0ZltAj98JfP4 .loopText,#mermaid-svg-VNPO0ZltAj98JfP4 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-VNPO0ZltAj98JfP4 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-VNPO0ZltAj98JfP4 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-VNPO0ZltAj98JfP4 .noteText,#mermaid-svg-VNPO0ZltAj98JfP4 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-VNPO0ZltAj98JfP4 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VNPO0ZltAj98JfP4 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VNPO0ZltAj98JfP4 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VNPO0ZltAj98JfP4 .actorPopupMenu{position:absolute;}#mermaid-svg-VNPO0ZltAj98JfP4 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-VNPO0ZltAj98JfP4 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VNPO0ZltAj98JfP4 .actor-man circle,#mermaid-svg-VNPO0ZltAj98JfP4 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-VNPO0ZltAj98JfP4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ApplicationContext BeanFactoryPostProcessor BeanPostProcessor Java配置类 1. 执行 BeanFactoryPostProcessor 2. 注册 BeanPostProcessor 3. 创建和初始化 3.1 依赖注入扩展(如 @Value 和 @Autowired) 3.2 初始化扩展(如 @PostConstruct) 3.3 执行 Aware 及 InitializingBean 3.4 创建成功 ApplicationContext BeanFactoryPostProcessor BeanPostProcessor Java配置类
Java 配置类包含 BeanFactoryPostProcessor 的情况,因此要创建其中的 BeanFactoryPostProcessor 必须提前创建 Java 配置类,而此时的 BeanPostProcessor 还未准备好,导致 @Autowired 等注解失效
#mermaid-svg-kcY2Xf1rjBToB8cE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kcY2Xf1rjBToB8cE .error-icon{fill:#552222;}#mermaid-svg-kcY2Xf1rjBToB8cE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kcY2Xf1rjBToB8cE .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-kcY2Xf1rjBToB8cE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kcY2Xf1rjBToB8cE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kcY2Xf1rjBToB8cE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kcY2Xf1rjBToB8cE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kcY2Xf1rjBToB8cE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kcY2Xf1rjBToB8cE .marker.cross{stroke:#333333;}#mermaid-svg-kcY2Xf1rjBToB8cE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kcY2Xf1rjBToB8cE .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kcY2Xf1rjBToB8cE text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-kcY2Xf1rjBToB8cE .actor-line{stroke:grey;}#mermaid-svg-kcY2Xf1rjBToB8cE .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-kcY2Xf1rjBToB8cE .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-kcY2Xf1rjBToB8cE #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-kcY2Xf1rjBToB8cE .sequenceNumber{fill:white;}#mermaid-svg-kcY2Xf1rjBToB8cE #sequencenumber{fill:#333;}#mermaid-svg-kcY2Xf1rjBToB8cE #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-kcY2Xf1rjBToB8cE .messageText{fill:#333;stroke:#333;}#mermaid-svg-kcY2Xf1rjBToB8cE .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kcY2Xf1rjBToB8cE .labelText,#mermaid-svg-kcY2Xf1rjBToB8cE .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-kcY2Xf1rjBToB8cE .loopText,#mermaid-svg-kcY2Xf1rjBToB8cE .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-kcY2Xf1rjBToB8cE .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-kcY2Xf1rjBToB8cE .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-kcY2Xf1rjBToB8cE .noteText,#mermaid-svg-kcY2Xf1rjBToB8cE .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-kcY2Xf1rjBToB8cE .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kcY2Xf1rjBToB8cE .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kcY2Xf1rjBToB8cE .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-kcY2Xf1rjBToB8cE .actorPopupMenu{position:absolute;}#mermaid-svg-kcY2Xf1rjBToB8cE .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-kcY2Xf1rjBToB8cE .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-kcY2Xf1rjBToB8cE .actor-man circle,#mermaid-svg-kcY2Xf1rjBToB8cE line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-kcY2Xf1rjBToB8cE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ApplicationContext BeanFactoryPostProcessor BeanPostProcessor Java配置类 3. 创建和初始化 3.1 执行 Aware 及 InitializingBean 3.2 创建成功 1. 执行 BeanFactoryPostProcessor 2. 注册 BeanPostProcessor ApplicationContext BeanFactoryPostProcessor BeanPostProcessor Java配置类
对应代码
@Configuration
public class MyConfig1 {
private static final Logger log = LoggerFactory.getLogger(MyConfig1.class);
@Autowired
public void setApplicationContext(ApplicationContext applicationContext) {
log.debug("注入 ApplicationContext");
}
@PostConstruct
public void init() {
log.debug("初始化");
}
@Bean // ⬅️ 注释或添加 beanFactory 后处理器对应上方两种情况
public BeanFactoryPostProcessor processor1() {
return beanFactory -> {
log.debug("执行 processor1");
};
}
}
注意 解决方法:
com.libin.a07 包
Spring 提供了多种初始化手段,除了课堂上讲的 @PostConstruct,@Bean(initMethod) 之外,还可以实现 InitializingBean 接口来进行初始化,如果同一个 bean 用了以上手段声明了 3 个初始化方法,那么它们的执行顺序是
与初始化类似,Spring 也提供了多种销毁手段,执行顺序为
在当前版本的 Spring 和 Spring Boot 程序中,支持五种 Scope
有些文章提到有 globalSession 这一 Scope,也是陈旧的说法,目前 Spring 中已废弃
但要注意,如果在 singleton 注入其它 scope 都会有问题,解决方法有
com.libin.a08 包
以单例注入多例为例
有一个单例对象 E
@Component
public class E {
private static final Logger log = LoggerFactory.getLogger(E.class);
private F f;
public E() {
log.info("E()");
}
@Autowired
public void setF(F f) {
this.f = f;
log.info("setF(F f) {}", f.getClass());
}
public F getF() {
return f;
}
}
要注入的对象 F 期望是多例
@Component
@Scope("prototype")
public class F {
private static final Logger log = LoggerFactory.getLogger(F.class);
public F() {
log.info("F()");
}
}
测试
E e = context.getBean(E.class);
F f1 = e.getF();
F f2 = e.getF();
System.out.println(f1);
System.out.println(f2);
输出
com.libin.demo.cycle.F@6622fc65
com.libin.demo.cycle.F@6622fc65
发现它们是同一个对象,而不是期望的多例对象
对于单例对象来讲,依赖注入仅发生了一次,后续再没有用到多例的 F,因此 E 用的始终是第一次依赖注入的 F
#mermaid-svg-nfbHhKgaqtpUIPNv {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nfbHhKgaqtpUIPNv .error-icon{fill:#552222;}#mermaid-svg-nfbHhKgaqtpUIPNv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nfbHhKgaqtpUIPNv .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-nfbHhKgaqtpUIPNv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nfbHhKgaqtpUIPNv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nfbHhKgaqtpUIPNv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nfbHhKgaqtpUIPNv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nfbHhKgaqtpUIPNv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nfbHhKgaqtpUIPNv .marker.cross{stroke:#333333;}#mermaid-svg-nfbHhKgaqtpUIPNv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nfbHhKgaqtpUIPNv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-nfbHhKgaqtpUIPNv .cluster-label text{fill:#333;}#mermaid-svg-nfbHhKgaqtpUIPNv .cluster-label span{color:#333;}#mermaid-svg-nfbHhKgaqtpUIPNv .label text,#mermaid-svg-nfbHhKgaqtpUIPNv span{fill:#333;color:#333;}#mermaid-svg-nfbHhKgaqtpUIPNv .node rect,#mermaid-svg-nfbHhKgaqtpUIPNv .node circle,#mermaid-svg-nfbHhKgaqtpUIPNv .node ellipse,#mermaid-svg-nfbHhKgaqtpUIPNv .node polygon,#mermaid-svg-nfbHhKgaqtpUIPNv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-nfbHhKgaqtpUIPNv .node .label{text-align:center;}#mermaid-svg-nfbHhKgaqtpUIPNv .node.clickable{cursor:pointer;}#mermaid-svg-nfbHhKgaqtpUIPNv .arrowheadPath{fill:#333333;}#mermaid-svg-nfbHhKgaqtpUIPNv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-nfbHhKgaqtpUIPNv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-nfbHhKgaqtpUIPNv .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-nfbHhKgaqtpUIPNv .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-nfbHhKgaqtpUIPNv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-nfbHhKgaqtpUIPNv .cluster text{fill:#333;}#mermaid-svg-nfbHhKgaqtpUIPNv .cluster span{color:#333;}#mermaid-svg-nfbHhKgaqtpUIPNv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-nfbHhKgaqtpUIPNv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
e 创建
e set 注入 f
f 创建
解决
#mermaid-svg-m76d5qSKIc0gg0U3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-m76d5qSKIc0gg0U3 .error-icon{fill:#552222;}#mermaid-svg-m76d5qSKIc0gg0U3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-m76d5qSKIc0gg0U3 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-m76d5qSKIc0gg0U3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-m76d5qSKIc0gg0U3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-m76d5qSKIc0gg0U3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-m76d5qSKIc0gg0U3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-m76d5qSKIc0gg0U3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-m76d5qSKIc0gg0U3 .marker.cross{stroke:#333333;}#mermaid-svg-m76d5qSKIc0gg0U3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-m76d5qSKIc0gg0U3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-m76d5qSKIc0gg0U3 .cluster-label text{fill:#333;}#mermaid-svg-m76d5qSKIc0gg0U3 .cluster-label span{color:#333;}#mermaid-svg-m76d5qSKIc0gg0U3 .label text,#mermaid-svg-m76d5qSKIc0gg0U3 span{fill:#333;color:#333;}#mermaid-svg-m76d5qSKIc0gg0U3 .node rect,#mermaid-svg-m76d5qSKIc0gg0U3 .node circle,#mermaid-svg-m76d5qSKIc0gg0U3 .node ellipse,#mermaid-svg-m76d5qSKIc0gg0U3 .node polygon,#mermaid-svg-m76d5qSKIc0gg0U3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-m76d5qSKIc0gg0U3 .node .label{text-align:center;}#mermaid-svg-m76d5qSKIc0gg0U3 .node.clickable{cursor:pointer;}#mermaid-svg-m76d5qSKIc0gg0U3 .arrowheadPath{fill:#333333;}#mermaid-svg-m76d5qSKIc0gg0U3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-m76d5qSKIc0gg0U3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-m76d5qSKIc0gg0U3 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-m76d5qSKIc0gg0U3 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-m76d5qSKIc0gg0U3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-m76d5qSKIc0gg0U3 .cluster text{fill:#333;}#mermaid-svg-m76d5qSKIc0gg0U3 .cluster span{color:#333;}#mermaid-svg-m76d5qSKIc0gg0U3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-m76d5qSKIc0gg0U3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
使用f方法
使用f方法
使用f方法
e 创建
e set 注入 f代理
f 创建
f 创建
f 创建
@Component
public class E {
@Autowired
@Lazy
public void setF(F f) {
this.f = f;
log.info("setF(F f) {}", f.getClass());
}
// ...
}
注意
输出
E: setF(F f) class com.libin.demo.cycle.F$$EnhancerBySpringCGLIB$$8b54f2bc
F: F()
com.libin.demo.cycle.F@3a6f2de3
F: F()
com.libin.demo.cycle.F@56303b57
从输出日志可以看到调用 setF 方法时,f 对象的类型是代理类型
com.libin.a08.sub 包
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。