当前位置: 首页 > news >正文

重庆市网站推广去电商公司上班怎么样

重庆市网站推广,去电商公司上班怎么样,大流量网站解决访问量,帝国cms怎么做淘客网站如果您使用Spring框架超过一个星期#xff0c;那么您可能已经知道此功能。 假设您有多个bean实现了给定的接口。 尝试仅自动接线此类接口的一个bean注定会失败#xff0c;因为Spring不知道您需要哪个特定实例。 您可以通过使用Primary批注来指定一个优先于其他实现的“ 最重要… 如果您使用Spring框架超过一个星期那么您可能已经知道此功能。 假设您有多个bean实现了给定的接口。 尝试仅自动接线此类接口的一个bean注定会失败因为Spring不知道您需要哪个特定实例。 您可以通过使用Primary批注来指定一个优先于其他实现的“ 最重要 ”实现来解决此问题。 但是在许多合法的用例中您想注入实现该接口的所有 bean。 例如您有多个验证器所有验证器都需要在要同时执行的业务逻辑或几种算法实现之前执行。 自动发现所有的实现在运行时是一个奇妙的例证打开/关闭原理 您可以轻松地添加新的行为以业务逻辑验证算法策略-对扩展开放 无需触摸的业务逻辑本身修改关闭 。 万一我有一个快速的介绍请随时直接跳到后续章节。 因此让我们举一个具体的例子。 假设您有一个StringCallable接口和多个实现 interface StringCallable extends CallableString { }Component class Third implements StringCallable {Overridepublic String call() {return 3;}}Component class Forth implements StringCallable {Overridepublic String call() {return 4;}}Component class Fifth implements StringCallable {Overridepublic String call() throws Exception {return 5;} } 现在我们可以将ListStringCallable SetStringCallable或MapString, StringCallable String代表bean名称注入其他任何类。 为了简化我将注入一个测试用例 SpringBootApplication public class Bootstrap { }ContextConfiguration(classes Bootstrap) class BootstrapTest extends Specification {AutowiredListStringCallable list;AutowiredSetStringCallable set;AutowiredMapString, StringCallable map;def injecting all instances of StringCallable() {expect:list.size() 3set.size() 3map.keySet() [third, forth, fifth].toSet()}def enforcing order of injected beans in List() {when:def result list.collect { it.call() }then:result [3, 4, 5]}def enforcing order of injected beans in Set() {when:def result set.collect { it.call() }then:result [3, 4, 5]}def enforcing order of injected beans in Map() {when:def result map.values().collect { it.call() }then:result [3, 4, 5]}} 到目前为止一切都很好但是只有第一个测试通过您能猜出为什么吗 Condition not satisfied:result [3, 4, 5] | | | false [3, 5, 4] 毕竟我们为什么要假设将以与声明bean相同的顺序注入bean 按字母顺序 幸运的是可以使用Ordered接口执行订单 interface StringCallable extends CallableString, Ordered { }Component class Third implements StringCallable {//...Override public int getOrder() {return Ordered.HIGHEST_PRECEDENCE;} }Component class Forth implements StringCallable {//...Override public int getOrder() {return Ordered.HIGHEST_PRECEDENCE 1;} }Component class Fifth implements StringCallable {//...Override public int getOrder() {return Ordered.HIGHEST_PRECEDENCE 2;} } 有趣的是即使Spring内部注入了LinkedHashMap和LinkedHashSet 也只能正确地排序List 。 我猜它没有记录也就不足为奇了。 为了结束本介绍您还可以在Java 8中注入OptionalMyService 它按预期方式工作仅在依赖项可用时注入依赖项。 可选依赖项可能会出现例如在广泛使用配置文件时并且某些配置文件中没有引导某些bean。 处理列表非常麻烦。 大多数情况下您要遍历它们以便避免重复将这样的列表封装在专用包装器中很有用 Component public class Caller {private final ListStringCallable callables;Autowiredpublic Caller(ListStringCallable callables) {this.callables callables;}public String doWork() {return callables.stream().map(StringCallable::call).collect(joining(|));}} 我们的包装器简单地一个接一个地调用所有底层可调用对象并将它们的结果联接在一起 ContextConfiguration(classes Bootstrap) class CallerTest extends Specification {AutowiredCaller callerdef Caller should invoke all StringCallbles() {when:def result caller.doWork()then:result 3|4|5}} 这有点争议但通常此包装器也实现相同的接口从而有效地实现复合经典设计模式 Component Primary public class Caller implements StringCallable {private final ListStringCallable callables;Autowiredpublic Caller(ListStringCallable callables) {this.callables callables;}Overridepublic String call() {return callables.stream().map(StringCallable::call).collect(joining(|));}} 感谢Primary我们可以在任何地方简单地自动连接StringCallable 就好像只有一个bean而实际上有多个bean一样我们可以注入Composite。 在重构旧应用程序时这很有用因为它保留了向后兼容性。 为什么我甚至从所有这些基础开始 如果你仔细关系十分密切代码片段上面介绍鸡和蛋的问题实例StringCallable需要的所有实例StringCallable 所以从技术上来说callables列表应该包括Caller为好。 但是Caller当前正在创建中所以这是不可能的。 这很有道理幸运的是Spring意识到了这种特殊情况。 但是在更高级的情况下这可能会咬你。 后来新的开发人员介绍了这一点 Component public class EnterpriseyManagerFactoryProxyHelperDispatcher {private final Caller caller;Autowiredpublic EnterpriseyManagerFactoryProxyHelperDispatcher(Caller caller) {this.caller caller;} } 到目前为止除了类名其他都没错。 但是如果其中一个StringCallables对此有依赖关系会怎样 Component class Fifth implements StringCallable {private final EnterpriseyManagerFactoryProxyHelperDispatcher dispatcher;Autowiredpublic Fifth(EnterpriseyManagerFactoryProxyHelperDispatcher dispatcher) {this.dispatcher dispatcher;}} 现在我们创建了一个循环依赖关系并且由于我们通过构造函数进行注入这一直是我们的本意因此Spring在启动时会一巴掌 UnsatisfiedDependencyException:Error creating bean with name caller defined in file ... UnsatisfiedDependencyException: Error creating bean with name fifth defined in file ... UnsatisfiedDependencyException: Error creating bean with name enterpriseyManagerFactoryProxyHelperDispatcher defined in file ... BeanCurrentlyInCreationException: Error creating bean with name caller: Requested bean is currently in creation: Is there an unresolvable circular reference? 和我在一起我在这里建立高潮。 显然这是一个错误很遗憾可以通过字段注入或与此有关的设置来解决 Component public class Caller {Autowiredprivate ListStringCallable callables;public String doWork() {return callables.stream().map(StringCallable::call).collect(joining(|));}} 通过将注入的Bean创建与耦合分离构造函数注入是不可能的我们现在可以创建一个循环依赖图其中Caller持有Fifth类的一个实例该实例引用Enterprisey... 而后者又又引用了同一Caller实例。 依赖关系图中的循环是一种设计气味导致无法维持意大利面条关系图。 请避免使用它们并且如果构造函数注入可以完全阻止它们那就更好了。 会议 有趣的是还有另一种直接适用于Spring guts的解决方案 ListableBeanFactory.getBeansOfType() Component public class Caller {private final ListStringCallable callables;Autowiredpublic Caller(ListableBeanFactory beanFactory) {callables new ArrayList(beanFactory.getBeansOfType(StringCallable.class).values());}public String doWork() {return callables.stream().map(StringCallable::call).collect(joining(|));}} 问题解决了 恰恰相反 getBeansOfType()会静默跳过正在创建的bean嗯有TRACE和DEBUG日志…并且仅返回那些已经存在的bean。 因此刚刚创建了Caller并成功启动了容器而它不再引用Fifth bean。 您可能会说我要这样因为我们有一个循环依赖关系所以会发生奇怪的事情。 但这是getBeansOfType()的固有功能。 为了理解为什么在容器启动过程中使用getBeansOfType()是个坏主意 请查看以下情形省略了不重要的代码 Component class Alpha {static { log.info(Class loaded); }Autowiredpublic Alpha(ListableBeanFactory beanFactory) {log.info(Constructor);log.info(Constructor (beta?): {}, beanFactory.getBeansOfType(Beta.class).keySet());log.info(Constructor (gamma?): {}, beanFactory.getBeansOfType(Gamma.class).keySet());}PostConstructpublic void init() {log.info(PostConstruct (beta?): {}, beanFactory.getBeansOfType(Beta.class).keySet());log.info(PostConstruct (gamma?): {}, beanFactory.getBeansOfType(Gamma.class).keySet());}}Component class Beta {static { log.info(Class loaded); }Autowiredpublic Beta(ListableBeanFactory beanFactory) {log.info(Constructor);log.info(Constructor (alpha?): {}, beanFactory.getBeansOfType(Alpha.class).keySet());log.info(Constructor (gamma?): {}, beanFactory.getBeansOfType(Gamma.class).keySet());}PostConstructpublic void init() {log.info(PostConstruct (alpha?): {}, beanFactory.getBeansOfType(Alpha.class).keySet());log.info(PostConstruct (gamma?): {}, beanFactory.getBeansOfType(Gamma.class).keySet());}}Component class Gamma {static { log.info(Class loaded); }public Gamma() {log.info(Constructor);}PostConstructpublic void init() {log.info(PostConstruct);} } 日志输出显示了Spring如何在内部加载和解析类 Alpha: | Class loaded Alpha: | Constructor Beta: | Class loaded Beta: | Constructor Beta: | Constructor (alpha?): [] Gamma: | Class loaded Gamma: | Constructor Gamma: | PostConstruct Beta: | Constructor (gamma?): [gamma] Beta: | PostConstruct (alpha?): [] Beta: | PostConstruct (gamma?): [gamma] Alpha: | Constructor (beta?): [beta] Alpha: | Constructor (gamma?): [gamma] Alpha: | PostConstruct (beta?): [beta] Alpha: | PostConstruct (gamma?): [gamma] Spring框架首先加载Alpha并尝试实例化bean。 但是在运行getBeansOfType(Beta.class)它会发现Beta因此将继续加载并实例化该Beta 。 在Beta内部我们可以立即发现问题当Beta询问beanFactory.getBeansOfType(Alpha.class)时不会得到任何结果 [] 。 Spring将默默地忽略Alpha 因为它正在创建中。 后来一切都按预期进行 Gamma已加载构造和注入 Beta看到了Gamma 当我们返回Alpha 一切就绪。 请注意即使将getBeansOfType()移至PostConstruct方法也无济于事–在实例化所有bean时最终不会执行这些回调–而是在容器启动时。 意见建议 很少需要getBeansOfType() 如果您具有循环依赖性那么结果是不可预测的。 当然您首先应该避免使用它们如果您通过集合正确注入了依赖关系Spring可以预见地处理所有bean的生命周期并正确地连接它们或在运行时失败。 在bean之间存在循环依赖关系时有时是偶然的或者在依赖关系图中的节点和边方面很长 getBeansOfType()会根据我们无法控制的因素例如CLASSPATH顺序getBeansOfType()产生不同的结果。 PS对JakubKubryński进行getBeansOfType()疑难解答表示getBeansOfType() 。 翻译自: https://www.javacodegeeks.com/2015/04/spring-injecting-lists-maps-optionals-and-getbeansoftype-pitfalls.html
http://www.zqtcl.cn/news/276935/

相关文章:

  • 大连网站关键词推广网站建设合同报价
  • 网站维护费用一年多少广州h5网站建设
  • 如何搭建静态网站源码手机开发软件app的工具
  • 之前做的网站推广怎么删除专业做网站官网
  • 泉州做 php 网站宁波信息港
  • 网站建设专员招聘如何建立网站会员系统
  • 佛山网站关键词自助建站教程
  • 海口网站seo做网站域名后缀选择
  • 网站建设新手看什么书网络营销推广师
  • 小浣熊做单网站观看床做视频网站
  • 网站版面布局结构图门户网站要求
  • 网站左侧广告代码网站建设交接协议书
  • dedecms网站上传华为网络营销案例分析
  • wordpress搭建站点龙岗网站建设代理商
  • 做销售网站要多少钱建立网站的流程
  • 视频类网站如何做缓存网页设计框架怎么写
  • wordpress建站访问提示不安全网页加速器哪个最好用
  • 网博士自助建站系统下载毕业设计代做网站唯一
  • 江西网站建设优化服务营销软文范例大全100字
  • 图片类网站怎样做高并发专业做旗袍花的网站是什么网站
  • 我要建网站需要什么专业网站制作全包
  • 网站开发合同印花税自定义手机网站建设
  • 营销型网站开发流程制作网站需要钱吗
  • 提供有经验的网站建设百度识图识别
  • html手机网站怎么做湖南关键词优化品牌推荐
  • 网站定制开发收费标准是多少易语言如何做浏网站
  • 网站怎么做实名认证新手怎么开婚庆公司
  • .net做网站用什么技术网站优化排名方案
  • 电商网站备案流程网站移动端优化的重点有哪些
  • 数据需求 网站建设做qq空间的网站