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

cmd iis网站服装网站 欣赏

cmd iis网站,服装网站 欣赏,自己做的网站如何上线,医院网站建设 中标尽管依赖项注入 #xff08;也称为“ DI”#xff09;是一种在OOP中组成对象的自然技术#xff08;在Martin Fowler引入该术语之前就已知道#xff09;#xff0c;但Spring IoC #xff0c; Google Guice #xff0c; Java EE6 CDI #xff0c; Dagger和其他DI框架将其… 尽管依赖项注入 也称为“ DI”是一种在OOP中组成对象的自然技术在Martin Fowler引入该术语之前就已知道但Spring IoC Google Guice Java EE6 CDI Dagger和其他DI框架将其转变为反模式。 我将不讨论反对“ setter注入”例如在Spring IoC中 和“现场注入”例如在PicoContainer中 的明显论点。 这些机制仅违反了面向对象编程的基本原理并鼓励我们创建不完整的可变对象这些对象在应用程序执行过程中会塞满数据。 请记住理想对象必须是不可变的 并且不能包含setter 。 相反让我们讨论一下“构造函数注入”例如Google Guice中的方法 及其与依赖注入容器的结合使用 。 我将尝试说明为什么至少将这些容器视为冗余。 什么是依赖注入 这就是依赖项注入与普通的旧对象组成没有真正的区别 public class Budget {private final DB db;public Budget(DB data) {this.db data;}public long total() {return this.db.cell(SELECT SUM(cost) FROM ledger);} } 对象data称为“依赖关系”。 Budget不知道它正在使用哪种数据库。 它需要从数据库中获得的所有功能就是能够通过cell()方法使用任意SQL查询来获取单元cell() 。 我们可以使用DB接口的PostgreSQL实现实例化Budget 例如 public class App {public static void main(String... args) {Budget budget new Budget(new Postgres(jdbc:postgresql:5740/main));System.out.println(Total is: budget.total());} } 换句话说我们正在将依赖项“注入”到新的对象budget 。 这种“依赖注入”方法的替代方法是让Budget决定要使用的数据库 public class Budget {private final DB db new Postgres(jdbc:postgresql:5740/main);// class methods } 这非常脏导致1代码重复2无法重用和3无法测试等。无需讨论原因。 很明显。 因此通过构造函数进行依赖注入是一种了不起的技术。 好吧真的没有技术。 更像Java和所有其他面向对象语言的功能。 预计几乎所有对象都希望封装一些知识也称为“状态”。 这就是构造函数的用途。 什么是DI容器 到目前为止一切都很好但是这里面是阴暗的一面-依赖项注入容器。 它是这样工作的让我们以Google Guice为例 import javax.inject.Inject; public class Budget {private final DB db;Injectpublic Budget(DB data) {this.db data;}// same methods as above } 注意构造函数带有Inject注释。 然后我们应该在应用程序启动时在某处配置一个容器 Injector injector Guice.createInjector(new AbstractModule() {Overridepublic void configure() {this.bind(DB.class).toInstance(new Postgres(jdbc:postgresql:5740/main));}} ); 一些框架甚至允许我们在XML文件中配置注入器。 从现在开始我们将无法像以前一样通过new运算符实例化Budget 。 相反我们应该使用刚创建的注射器 public class App {public static void main(String... args) {Injection injector // as we just did in the previous snippetBudget budget injector.getInstance(Budget.class);System.out.println(Total is: budget.total());} } 注入自动发现要实例化Budget它必须为其构造函数提供一个参数。 它将使用我们在注射器中实例化的Postgres类的实例。 这是使用Guice的正确和推荐的方法。 不过有一些甚至更暗的模式这是可能的但不建议这样做。 例如您可以使喷射器成为单例并在Budget类中直接使用它。 这些机制甚至被DI容器制造商都认为是错误的因此让我们忽略它们重点关注推荐的方案。 这个是来做什么的 让我重申并总结不正确使用依赖项注入容器的场景 现场注入 二传手注射 将注入器作为依赖项 使注入器成为全局单例 如果我们把它们都放在一边剩下的就是上面解释的构造函数注入。 那对我们有什么帮助 我们为什么需要它 为什么我们不能在应用程序的主类中使用普通的new 如果使用XML我们创建的容器只是向代码库添加了更多行甚至添加了更多文件。 它除了增加了复杂性之外没有增加任何东西。 如果遇到以下问题我们应该永远记住这一点“哪个数据库用作预算的论点” 正确的方式 现在让我向您展示一个使用new构造应用程序的真实示例。 这是我们在rultor.com中创建“思维引擎”的方式 完整的类在Agents.java final Agent agent new Agent.Iterative(new Array(new Understands(this.github,new QnSince(49092213,new QnReferredTo(this.github.users().self().login(),new QnParametrized(new Question.FirstOf(new Array(new QnIfContains(config, new QnConfig(profile)),new QnIfContains(status, new QnStatus(talk)),new QnIfContains(version, new QnVersion()),new QnIfContains(hello, new QnHello()),new QnIfCollaborator(new QnAlone(talk, locks,new Question.FirstOf(new Array(new QnIfContains(merge,new QnAskedBy(profile,Agents.commanders(merge),new QnMerge())),new QnIfContains(deploy,new QnAskedBy(profile,Agents.commanders(deploy),new QnDeploy())),new QnIfContains(release,new QnAskedBy(profile,Agents.commanders(release),new QnRelease())))))))))))),new StartsRequest(profile),new RegistersShell(b1.rultor.com, 22,rultor,IOUtils.toString(this.getClass().getResourceAsStream(rultor.key),CharEncoding.UTF_8)),new StartsDaemon(profile),new KillsDaemon(TimeUnit.HOURS.toMinutes(2L)),new EndsDaemon(),new EndsRequest(),new Tweets(this.github,new OAuthTwitter(Manifests.read(Rultor-TwitterKey),Manifests.read(Rultor-TwitterSecret),Manifests.read(Rultor-TwitterToken),Manifests.read(Rultor-TwitterTokenSecret))),new CommentsTag(this.github),new Reports(this.github),new RemovesShell(),new ArchivesDaemon(new ReRegion(new Region.Simple(Manifests.read(Rultor-S3Key),Manifests.read(Rultor-S3Secret))).bucket(Manifests.read(Rultor-S3Bucket))),new Publishes(profile)) ); 印象深刻 这是真正的对象组成。 我相信这是应该实例化正确的面向对象应用程序的方式。 和DI容器 我认为它们只会增加不必要的噪音。 相关文章 您可能还会发现以下有趣的帖子 吸气剂/设定者。 邪恶。 期。 OOP中的反模式 避免字符串串联 对象应该是不可变的 为什么NULL是错误的 翻译自: https://www.javacodegeeks.com/2014/10/di-containers-are-code-polluters.html
http://www.pierceye.com/news/113415/

相关文章:

  • 工商局网站怎么做股东实名认证石家庄网站建设公司怎么样
  • 做公众号的模版的网站国内网站做国外服务器
  • 做国际网站的上海高端网站公司wordpress 4.9.6 下载
  • 学校集约网站建设最牛餐饮营销手段
  • wordpress影视站网站太花哨
  • 青岛 机械 中企动力提供网站建设小说网站怎么做空间小
  • 通江县网站建设做网站到八方资源网怎么样
  • 国家网站建设ssh架构jsp网站开发
  • 浦东新区手机网站设计网络营销做得好的产品
  • 浙江市建设网站市场监督管理局电话举报电话
  • 企业网站的建设的功能定位菏泽百度推广公司电话
  • linux系统怎么做网站女生去住建局好不好
  • 自己搭建环境建设网站网站开发温州
  • 下沙做网站软件erp系统的主要功能
  • 郑州网站建设专家最新手机排行榜2021
  • 宠物店网站建设策划书重庆网站建设 红旗河沟
  • 一般网站自己可以做播放器吗最简单的一个网站开发
  • 网站的开发商务网站安全方案设计
  • 如何建立网站教材漳诈网站建设
  • 开家网站设计公司广州网站建设app开发
  • 建站服务公司网站源码成都游戏外包公司排名
  • 呼伦贝尔网站建设呼伦贝尔astro wordpress
  • 做网站需要好多钱专业制作广告字
  • 网站建设的需要是什么seo营销方案
  • 网站开发服务的协议wordpress自动翻译
  • 网站网站制作400多少钱wordpress 会员积分
  • 天津网站建设首选津坤科技做视频网站用什么好处
  • wordpress ffmpegsem seo是什么意思呢
  • 九江建网站的公司做废钢那个网站好
  • 做网站官网需多少钱wordpress查看访问者ip