长春网站建设新格,天津网站建设诺亚,网页设计专业培训,百度推广怎么做步骤spring lazySpring框架几乎可以毫不费力地为您解决许多常见的编程问题#xff0c;但是其某些功能比其他功能鲜为人知。 在本文中#xff0c;我们将仔细研究属于该组的Lazy批注。 阅读了几个示例之后#xff0c;您应该能够将注释应用于日常开发任务。 1. 懒豆初始化 Spring的… spring lazy Spring框架几乎可以毫不费力地为您解决许多常见的编程问题但是其某些功能比其他功能鲜为人知。 在本文中我们将仔细研究属于该组的Lazy批注。 阅读了几个示例之后您应该能够将注释应用于日常开发任务。 1. 懒豆初始化 Spring的默认行为是在应用程序启动时创建所有定义的bean。 如果我们考虑到这样的初始化可能会非常耗时的事实那么在用户开始负担服务器负担之前执行繁重的操作似乎是合理的。 但是我们是否真的总是需要将所有应用程序组件加载到内存中 您可能听说过帕累托原理及其适用于软件开发的事实 。 在确定了较少使用的功能之后 值得考虑对连接的bean进行延迟初始化尤其是当它们消耗宝贵的资源时 。 如何使豆子变得懒惰 根据声明此类bean的方式有两种选择。 如果声明中使用Bean注释的Configuration类你就必须与Lazy标注来标记它 Configuration
class SomeConfig {LazyBeanLazyResource lazyResource() {return new LazyResource();}} 如果bean使用组件注释之一并且在组件扫描过程中被发现则Lazy注释可以直接在bean类中使用 Lazy
Component
class LazyResource {//...
} Lazy也可以直接在Configuration类上使用。 在这种情况下 该类中定义的所有Bean对象都将被延迟初始化。 值得记住的是 用 Lazy 标记bean 并不意味着其依赖项也被延迟了初始化。 如果您对懒豆图初始化感兴趣可以通过以下方法实现 2. 惰性注入–延迟首次创建bean的时间 在bean定义旁边 Lazy批注还可用于注入点例如构造函数构造函数的参数字段和setter 。 下面是一个在整个构造函数上的惰性注入示例 由于从Spring 4.3开始不再需要Autowired注释因此省略了它这意味着所有定义的依赖项都将受到注释的影响。 Component
class RootResource {private final ResourceDependency dependency;LazyRootResource(ResourceDependency dependency) {this.dependency dependency;}} 无论使用哪种注入方法在所有情况下都将提供代理对象而不是引用实际依赖项。 重要的是要理解 如果一个关系用Lazy标记这并不意味着要延迟依赖bean的创建。 如果从属bean没有被Lazy本身标记它将由Spring容器急切地创建。 这种行为得出的结论是 延迟注入应该主要与延迟初始化一起使用 。 让我们考虑一个示例其中有两个相关的bean。 第一个bean标记有Lazy Lazy
Component
class LazyResource {//...
} 另一个急于初始化的bean取决于第一个bean但是注入点被标记为Lazy Component
class RootResource {private final LazyResource dependency;LazyRootResource(LazyResource dependency) {this.dependency dependency;}void useLazyDependency() {dependency.use();}} 在所描述的场景中当创建RootResource类的新实例时其依赖关系未初始化。 LazyResource的新实例是在实际需要时构建的 。 在此示例中这是第一次调用useLazyDependency方法的时刻。 通过从RootResource的构造函数中删除Lazy 必须在注入之前执行LazyResource Bean的初始化。 3.用Lazy注入解决循环依赖 应用程序中的循环依赖关系被认为是一种不良的设计模式但是如果您没有看到所面临问题的任何替代解决方案那么惰性注入可能会派上用场。 一旦您尝试在两个bean之间创建一个循环Spring将通过类似于以下所示的消息通知您有关此问题的信息 The dependencies of some of the beans in the application context form a cycle:
┌─────┐
| peerResource defined in file [...\dolszewski\blog\PeerResource.class]
↑ ↓
| someResource defined in file [...\dolszewski\blog\SomeResource.class]
└─────┘ 为了解决这个问题bean不必被延迟初始化。 Lazy批注仅在注入点之一上是必需的。 首先将创建一个将其依赖项标记为懒惰的依赖项。 4.渴望的豆与Lazyfalse 尽管与Lazy批注的第一个关联是按需创建bean的可能性但它也可以实现相反的效果-渴望初始化。 当您遇到Lazy批注并了解其存在时很可能您没有注意到它实际上可以接受其他布尔值属性该属性指示是否应进行惰性初始化。 您的第二个想法可能是使用Lazyfalse实际上是无用的因为您只需删除注释即可实现相同的效果对吗 如果考虑一下Spring的简单默认行为那是绝对正确的但是生活并不总是那么简单。 当应用程序的启动确实很慢时您可以考虑对所有托管bean进行延迟初始化以改善开发体验。 但是 有时有些bean应该始终进行初始化即使已使用 ComponentScanlazyInit true 全局禁用了急切的初始化 。 那就是Lazyfalse进来的时候。 Lazy(false)
Component
class AlwaysEagerResource {//...
}结论 熟悉Lazy批注的要求不是很高因为它仅接受一个属性并且只能在少数地方使用。 但是考虑到它的几种用途值得了解它的存在。 如果您发现该文章有用请与您的同事和同事分享。 您知道Lazy扮演主要角色之一的其他有用技巧吗 如果您愿意请立即在评论中添加评论。 翻译自: https://www.javacodegeeks.com/2018/03/spring-lazy-annotation-use-cases.htmlspring lazy