gpt4 book ai didi

java - 如何准确地工作基于 Spring Inheritance 的代理配置?

转载 作者:搜寻专家 更新时间:2023-11-01 03:37:22 26 4
gpt4 key购买 nike

我正在学习 Spring Core 认证,我发现了一些与代理 概念相关的疑问。

所以在学习 Material 上我发现了以下测验:

有一个 Java 配置类,它包含以下方法:

@Bean
public AccountRepository accountRepository(){
return new JdbcAccountRepository();
}

@Bean
public TransferService transferService1() {
TransferServiceImpl service = new TransferServiceImpl();
service.setAccountRepository(accountRepository());
return service;
}

@Bean
public TransferService transferService2() {
return new TransferServiceImpl( new JdbcAccountRepository() );
}

如您所见,transferService() 有 2 个不同的实现,分别命名为 transferService1()transferService2(),它们创建并返回一个 TransferServiceImpl 对象。

第一个创建一个新的 TransferServiceImpl 对象,然后对其调用 setAccountRepository() 方法。

第二个简单地创建一个 TransferServiceImpl 将一个新的 JdbcAccountRepository 对象传递给它的构造函数。

它问我**前两种方法之间最好的实现是什么?

提供的答案是:首选调用专用方法。所以我认为它说最好的方法是第一个实现。

它解释了 AccountRepository bean 是一个单例(因为它是 Spring 中 bean 的标准作用域)但是 JdbcAccountRepository() 可以被调用两次或更多次(例如,在前面的代码片段中,当调用方法 transferService1()transferService2() 时调用它,如果是这样的话成为一个问题,因为 AccountRepository 必须是一个单例

这是真的吗?还是我遗漏了什么?

所以我收集到在启动时为每个配置类(用 @Configuration 注释)创建了一个扩展我的配置类的子类

例如,如果我有以下配置类:

@Configuration
public class AppConfig {
@Bean public AccountRepository accountRepository() { ... }
@Bean public TransferService transferService() { ... }
}

它会自动创建以下扩展我的 AppConfig 的类:

public class AppConfig$$EnhancerByCGLIB$ extends AppConfig {
public AccountRepository accountRepository() { // ... }
public TransferService transferService() { // ... }
...
...
...
}

所以子类是入口点(调用的方法是子类中定义的方法)伪代码如下:

public class AppConfig$$EnhancerByCGLIB$ extends AppConfig {

public AccountRepository accountRepository() {
// if bean is in the applicationContext return bean
// else call super.accountRepository() and store bean in context
}

public TransferService transferService() {
// if bean is in the applicationContext, return bean
// else call super.transferService() and store bean in context
}
}

因此,Spring 如何处理单例问题似乎很清楚:它调用扩展配置类的代理类上的方法,如果请求的 bean 存在于 applicationContext 中,则返回此 beans,否则调用相同的方法在创建新 bean 并将其放入应用程序上下文的父类(super class)上

这是基于代理模式的继承的正确含义还是我遗漏了什么?

最佳答案

是的,你所描述的基本上就是如何Spring handles @Configuration classes

All @Configuration classes are subclassed at startup-time with CGLIB. In the subclass, the child method checks the container first for any cached (scoped) beans before it calls the parent method and creates a new instance.

如果认证题中的问题是只有一个new JdbcAccountRepository()的实例,那么,是的,最好使用accountRepository() @Bean @Configuration 中的方法类。

关于java - 如何准确地工作基于 Spring Inheritance 的代理配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26935845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com