将Spring Bean注入非托管对象
依赖注入带来的好处可能会上瘾。 使用注入配置应用程序结构比手动完成所有解析要容易得多。 当我们有一些在容器外部实例化的非托管类时,例如在Vaadin UI组件或JPA实体等其他框架中,它们是很难被退出的。 当我们使用域驱动设计时,后者尤其重要。 在Slawek Sobotka主持的 DDD培训期间,我们正在讨论消除骨料工厂中“不良耦合”的选项。 我相信您会承认,最好有一种通用机制能够通过@Inject注释定义的依赖关系来“激发”对象,而不是将所有必要的依赖关系注入特定的工厂,然后通过构造函数,构建器或简单的方法将它们传递给对象二传手。
Spring框架为我们带来了两种不同的解决方案来实现这一要求。 我现在将对它们两个进行描述。 让我们从简单的一个开始。
当我们使用通用存储库,前面提到的聚合工厂或什至任何其他工厂这样的案例时,它仅在确保我们的代码中只有很少的地方可以实例化容器外部的对象时,此功能特别强大。 在这种情况下,我们可以使用AutowireCapableBeanFactory类。 特别是,我们将对两种方法感兴趣:
- 无效的autowireBean(Object existingBean)
- 对象initializeBean(对象existingBean,字符串beanName)
第一个只是不使用特定的后处理器(例如@PostConstruct等)填充我们的bean。 第二种方法另外还应用了工厂回调,例如setBeanName和setBeanFactory,以及带有@PostConstruct的任何其他后期处理程序。 在我们的代码中,它将如下所示:
public abstract class GenericFactory<T> {@Autowiredprivate AutowireCapableBeanFactory autowireBeanFactory;public T createBean() {// creation logicautowireBeanFactory.autowireBean(createdBean);return createdBean;}
}
简单而强大-我最喜欢的作品。
但是,当我们在代码中有很多地方出生对象时,我们该怎么办? 例如在Spring Web应用程序中构建Vaadin布局的情况。 注入调用autowireBean方法的自定义bean配置器对象不会达到生产力的顶峰。 幸运的是,Spring开发人员为我们带来了@Configurable批注。 与方面相关联的此注释将配置每个带注释的对象,即使我们将使用new运算符在容器外部创建它也是如此。 与其他方面一样,我们可以在
- 浪费时间(LTW)
- 建立时间浪费(BTW)。
第一个更易于配置,但是(由于检测)我们依赖于应用程序服务器,在某些情况下这是不可取的。 要使用它,我们需要通过@EnableLoadTimeWeaving注释@Configuration类(或者,如果您喜欢Flintstones和XML配置,则添加<context:load-time-weaver />标记)。完成配置后,只需通过@Configurable注释类:
@Configurable
public class MyCustomButton extends Button {@Autowiredprivate MyAwesomeService myAwesomeService;// handlers making use of injected service
}
第二个选项的设置稍微复杂一些,但是此后运行时会轻很多。 因为现在我们要加载方面直到编译,所以我们必须将Aspectj编译器集成到我们的构建中。 在Maven中,您需要添加一些依赖项:
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.7.3</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>3.2.4.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>3.2.4.RELEASE</version>
</dependency>
<dependency><groupId>javax.persistence</groupId><artifactId>persistence-api</artifactId><version>1.0</version><scope>provided</scope>
</dependency>
我希望您很好奇为什么在上面可以看到persistence-api。 当我看到在AspectJ编译期间出现“无法确定缺少类型为javax.persistence.Entity的注释”错误时,这对我来说也很奇怪。 答案可以在SpringFramework JIRA的SPR-6819中找到 。 当您在aspectj-maven-plugin中将spring-aspects配置为aspectLibrary时,会发生这种情况。 该问题三年多未解决,因此请更好地习惯。 我们需要做的最后一件事是将上述插件包含在我们的插件部分中。
<plugin><groupId>org.codehaus.mojo</groupId><artifactId>aspectj-maven-plugin</artifactId><version>1.5</version><configuration><source>1.7</source><target>1.7</target><complianceLevel>1.7</complianceLevel><showWeaveInfo>true</showWeaveInfo><aspectLibraries><aspectLibrary><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId></aspectLibrary></aspectLibraries></configuration><executions><execution><goals><goal>compile</goal></goals></execution></executions>
</plugin>
这就是所有人!
翻译自: https://www.javacodegeeks.com/2013/09/injecting-spring-beans-into-non-managed-objects.html
将Spring Bean注入非托管对象相关推荐
- spring+cxf 开发webService(主要是记录遇到spring bean注入不进来的解决方法)
这里不介绍原理,只是记录自己spring+cxf的开发过程和遇到的问题 场景:第三方公司需要调用我们的业务系统,以xml报文的形式传递数据,之后我们解析报文存储到我们数据库生成业务单据: WebSer ...
- Spring bean注入之注解注入-- @Autowired原理
之前我们已经讲述过bean注入是什么了,也使用了xml的配置文件进行bean注入,这也是Spring的最原始的注入方式(xml注入). 本节课就讲注解注入. 主要讲解的注解有以下几个: @Autowi ...
- Spring bean注入方式
版权声明:本文为博主原创文章,如需转载请标注转载地址. 博客地址:http://www.cnblogs.com/caoyc/p/5619525.html Spring bean提供了3中注入方式:属 ...
- 如何将Spring Bean注入到JSF Converter
为什么80%的码农都做不了架构师?>>> 在项目中,因为想在自定义的JSF Converter中使用Spring Bean,经过搜索和测试,有两种方式可以达到目的 1)使用工具 ...
- java bean spring_Java+Spring+Bean+注入方式
1.首先准备共享文件 调用方法Client端Client.java: import org.springframework.context.support.ClassPathXmlApplicatio ...
- spring bean作用域_Spring面试知识点,这是我见过最全面的 - 知识铺
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停地来唤醒记忆深处的知识点. Q1.什么是Spring框架? Spring是最流行的企业应用程序框架之一.Spring ...
- Spring IoC,Spring Bean示例教程
Spring IoC,Spring Bean示例教程 欢迎来到Spring IoC示例教程.Spring Framework基于Inversion of Control原理.依赖注入是在应用程序中实现 ...
- 【Spring实战】注入非Spring Bean对象
2019独角兽企业重金招聘Python工程师标准>>> 大家经常用到Spring IOC去管理对象之间的依赖关系,但一般情况下都有一个前提:这些Bean对象必须是通过Spring容器 ...
- spring 托管bean_在非托管对象中使用Spring托管Bean
spring 托管bean 即使我们想使用现有的最佳和最新技术,我们也必须处理遗留代码. 想象一下,新代码是用Spring框架的最新技术编写的,而旧代码根本不是用Spring编写的. 然后,在非托管S ...
最新文章
- 程序猿老公去米国参加 WWDC,顺便想带渡老婆蜜月,如何办签证?
- vsftpd设置与使用总结
- python3.8安装插件locust报错error: Microsoft Visual C++ 14.0 is required. Get it with Microsoft Visual C++
- 取消挂载点可以节省磁盘么_磁盘克隆、磁盘镜像还有复制粘贴有什么不一样?...
- 机器学习进阶-优化的近邻算法
- python 爬虫难吗_python写爬虫难吗
- 我知道关于马云的故事,他不成功都难
- ASP.NET中的HTTP模块和处理程序
- 计算机网络应用基础试题6,计算机网络应用基础试题
- 前端开源项目周报0412
- 如何测试GPS的RAIM功能-->如何使用GSS7000测试RAIM
- 焊工作业2021年压力焊题库
- 百度(高德、GG歌)离线地图开发环境搭建【离线地图开发源代码】
- 3D Engine Demo
- 中国人民大学_《组织行为学》_19.冲突:怎样避免组织内耗?
- 三校生高考计算机基础知识,三校生高考计算机模拟试卷(一)
- 《设计模式》——接口隔离原则
- 稳定好用的短连接生成平台,支持API批量生成
- Windows Xp Sp3官方简体中文版(原版) 纯净安装版 百度网盘下载
- 【老生谈算法】MATLAB分形图形-树叶源码——分形图形
热门文章
- 时间格式转换2020-04-09T23:00:00.000+08:00
- 吃透 | Elasticsearch filter和query的不同
- mysql error 1045 的解决方法
- datagrid获取页面总记录数的方法,datagrid获取页面总记录数为0的解决方法
- javafx 表格列拖拉_JavaFX技巧22:“自动调整大小(树)”表列
- java中的方法求和_在Java中模拟求和类型的巧妙解决方法
- conditional_如何:在Spring中使用@Conditional和Condition注册组件
- jcache_随机JCache内容:多个提供程序和JMX Bean
- jClarity:在Azure上升级到Java
- html嵌入war_WAR文件与具有嵌入式服务器的Java应用程序