Java 是否可以选择<;T>;和“懒”在春天一起工作? 我必须让我@Component@Lazy,因为它很少使用,并且会产生循环依赖性问题 我必须将它设置为可选的,因为它所代表的功能可以在启动时被禁用(@ConditionalOnProperty),所以它在运行时可能不可用
问题: 当我使用Java 是否可以选择<;T>;和“懒”在春天一起工作? 我必须让我@Component@Lazy,因为它很少使用,并且会产生循环依赖性问题 我必须将它设置为可选的,因为它所代表的功能可以在启动时被禁用(@ConditionalOnProperty),所以它在运行时可能不可用,java,spring,Java,Spring,问题: 当我使用Optional作为注入点时,bean被急切地初始化。 因此,问题是: 有可能让它像那样工作吗 我可以用提供程序替换可选?如果功能被禁用,它会简单地返回null,还是抛出异常 是否可以将其替换为ObjectProvider 我想坚持使用@Resource或@Inject注释,因此@Autowired(required=false)将是我最后的选择 这里实际上没有可共享的代码(因为只有类和字段声明才相关) 既然你不相信我,代码在这里毫无价值,让我来分享:) 注入点 @Lazy @A
Optional
作为注入点时,bean被急切地初始化。
因此,问题是:
提供程序
替换可选
?如果功能被禁用,它会简单地返回null
,还是抛出异常ObjectProvider
@Resource
或@Inject
注释,因此@Autowired(required=false)
将是我最后的选择李>
这里实际上没有可共享的代码(因为只有类和字段声明才相关)
既然你不相信我,代码在这里毫无价值,让我来分享:)
注入点
@Lazy
@Autowired
private Optional<MyType> myType;
Iv在应用程序启动时测试
可选
和调试器点击MyType
。当我使用普通字段、提供程序或对象提供程序时,它会被跳过。在这种情况下,我不会直接连接组件,而是懒洋洋地连接。有不同的选择:
浏览ApplicationContext
并在需要时检索MyType
。只有当您知道它已启用时,才会检索它:
@Autowire
private ApplicationContext context;
...
MyType instance = context.getBean(MyType.class);
提供者或工厂方法,其中您有一个自动连线服务,为您提供MyType
的实例。此服务也仅在启用该功能时调用
@Autowire
private MyTypeFactory factory;
...
MyType instance = factory.getMyType();
使用提供程序
需要您在配置中定义一个bean,因此可能更容易使用一个POJO服务,您可以在其上使用@service
,这也是一样的。在这种情况下,我不会直接连接组件
,而是懒洋洋地连接。有不同的选择:
浏览ApplicationContext
并在需要时检索MyType
。只有当您知道它已启用时,才会检索它:
@Autowire
private ApplicationContext context;
...
MyType instance = context.getBean(MyType.class);
提供者或工厂方法,其中您有一个自动连线服务,为您提供MyType
的实例。此服务也仅在启用该功能时调用
@Autowire
private MyTypeFactory factory;
...
MyType instance = factory.getMyType();
使用提供程序
需要在配置中定义一个bean,因此可能更容易使用一个POJO服务,您可以在其上使用@service
,这也可以做到。让我来介绍另一种观点。我认为为此使用可选依赖项是不合理的
具有自动连线MyType的类可能依赖于此依赖关系(尽管在数据字段中使用Optional是一种不好的做法)
组件懒惰的原因似乎更多的是“黑客”而不是意图(循环依赖从来都不是一件好事)
因此,如果我们假设这个类使某些东西“可选可用”,一种方法是为这个MyType
有问题的bean提供一个额外的无操作实现:
interface MyType {
void doSomeHeavyStuff();
}
public class MyTypeRegularImpl() implements MyType {
public void doSomeHeavyStuff() {
....work..work..work..
}
}
public class NoOpMyType implements MyType {
public void doSomeHeavyStuff() {
// do nothing here
}
}
现在的诀窍是提供两个互斥条件,并确保这两个加载中只有一个bean(否则它将在bean中产生歧义,并可能在应用程序启动期间失败)
因此,使用MyType的类根本不需要可选的
关于懒惰。
一般来说,懒惰的bean只得到ini
懒Bean仍然可以使用,因为该Bean将在具有该懒依赖项的类中的第一次调用期间初始化
对于无操作bean,这一点都不重要。让我提出另一种观点。我认为为此使用可选依赖项是不合理的
具有自动连线MyType的类可能依赖于此依赖关系(尽管在数据字段中使用Optional是一种不好的做法)
组件懒惰的原因似乎更多的是“黑客”而不是意图(循环依赖从来都不是一件好事)
因此,如果我们假设这个类使某些东西“可选可用”,一种方法是为这个MyType
有问题的bean提供一个额外的无操作实现:
interface MyType {
void doSomeHeavyStuff();
}
public class MyTypeRegularImpl() implements MyType {
public void doSomeHeavyStuff() {
....work..work..work..
}
}
public class NoOpMyType implements MyType {
public void doSomeHeavyStuff() {
// do nothing here
}
}
现在的诀窍是提供两个互斥条件,并确保这两个加载中只有一个bean(否则它将在bean中产生歧义,并可能在应用程序启动期间失败)
因此,使用MyType的类根本不需要可选的
关于懒惰。
一般来说,懒惰的bean只得到ini
懒Bean仍然可以使用,因为该Bean将在具有该懒依赖项的类中的第一次调用期间初始化
对于无操作bean来说,这一点都不重要。您能展示几行代码吗?ObjectProvider`在我看来是一种替代注入可选依赖项的方法,为什么不简单地提供“NULL”MyType实现,它将什么都不做(或者像您的示例中那样抛出异常)在这种情况下,如果相应的功能被关闭。你能显示几行代码吗?ObjectProvider`在我看来是一种替代注入可选依赖项的方法,为什么不简单地提供“NULL”MyType实现,它将什么都不做(或者像你的示例中那样抛出异常)如果相应的功能已关闭,则在这种情况下。