小编WW.*_*WW.的帖子

当方法需要创建新对象时,有关依赖注入的新手问题

我一直在阅读关于依赖注入的问题并且有一个简单的问题.我可以理解如何通过构造函数或setter注入所需的依赖项由DI框架自动装配.当对象决定由于某些业务流程而需要创建新对象时会发生什么?在这些情况下,我是否需要始终创建工厂?为了使它成为一个不那么抽象的问题,这里有一个例子.

假设我正在写一个Asteriods游戏.中间有一艘船可以旋转并射击星号.假设已经创建了船并注入了适当的东西.当playerShip.shoot()被调用时,我们需要创建一个bullet对象.项目符号对象需要知道它的去向(direction以及从哪里开始(point).

通常,我会做这样的事情:

bullet = new Bullet( direction, point );
Run Code Online (Sandbox Code Playgroud)

但是,这将PlayerShip类与Bullet类紧密耦合.这应该如何在依赖注入下工作?我是否需要创建一个BulletFactory接口并将其实现注入到船中?

编辑:我实际上并没有写asteriods.这是一个我认为人们会理解的简单例子.我想要一些需要创建一个运行时(而不是"连接对象")的东西,它也有它的构造函数的参数.

language-agnostic dependency-injection

7
推荐指数
1
解决办法
275
查看次数

创建类时的依赖注入还需要运行时值吗?

假设您在Value对象和Services对象中划分系统(如"面向对象的软件增长,测试指导"中所述.Misko Hevery称这些为"newables"和"injectables".

当你的一个值对象突然需要访问服务来实现它的方法时会发生什么?

假设你有一个很好的简单Value对象.它是不可变的,包含一些信息,而且就是它.假设我们使用类似这样的东西:

CreditCard card = new CreditCard("4111-1111-1111-1111", "07/10");
if (card.isValid())
{
  // do stuff
} 
else
{
  // don't do stuff
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好. isValid()在卡号上实现校验位算法并返回true/false.

现在,假设我希望通过验证当前时间的到期日来增强系统.您如何在不破坏Value对象/服务对象paradim的情况下完成此操作?我希望这个课程能够继续进行单元测试.

  • CreditCard 现在有一个依赖项,但由于它的创建方式,它无法注入,因此依赖注入已经完成.
  • CreditCard类不应该呼唤单身(我的位置,为一个Singleton全球访问是不好的做法)
  • 将行为置于CreditCardVerificationService.validateCard()手段意味着必须重新访问所有现有代码.isValid()的实现正在泄漏.

我知道有一些事情可以解决这个问题,但最干净的方法是什么?

oop singleton dependency-injection injectable newable

7
推荐指数
1
解决办法
390
查看次数

有没有办法让Hibernate使用文字值而不是绑定变量?

在Oracle中,我有一个分区表.分区具有不同的大小并且具有不同的数据分布.

我想有hibernate问题SQL语句,其中包括分区键列的文字值而不是绑定变量.当然,它应该对任何其他值使用绑定变量.

使用分区键的文字将允许Oracle提出特定于已知分区和收集的统计信息的计划.对于具有偏斜数据的直方图的列,这可能也很有用.

最好在实体中指定它,否则我们将需要在每个查询中执行此操作.有没有办法在休眠中执行此操作?

我们使用Oracle 10g Dialect进行hibernate 3.6.1.

如果没有办法在Hibernate中本地执行此操作,我可以创建用户类型或方言或其他东西来实现这一目标吗?

oracle hibernate database-partitioning

7
推荐指数
1
解决办法
2644
查看次数

如何识别Oracle死锁中涉及的行?

当Oracle检测到死锁时,会写入如下跟踪文件:

*** SESSION ID:(56.27081) 2012-05-14 08:16:28.013
DEADLOCK DETECTED ( ORA-00060 )
[Transaction Deadlock]
The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock: Deadlock graph:
                       ---------Blocker(s)--------  ---------Waiter(s)---------
Resource Name          process session holds waits  process session holds waits
TX-0010002c-002719b5       146      56     X            164      44           X
TX-000f002a-002edd1e       164      44     X            146      56           X
session 56: …
Run Code Online (Sandbox Code Playgroud)

oracle deadlock

7
推荐指数
1
解决办法
1万
查看次数

java.lang.NoClassDefFoundError:com/sun/mirror/apt/AnnotationProcessorFactory执行时执行Enunciate ant任务

尝试使用Enunciate生成Java项目的文档时,我收到了以下堆栈跟踪.我正在使用JDK 1.8.0_25和Enunciate 1.30 RC1.

BUILD FAILED
C:\dev\PayWay\make\build.xml:882: java.lang.NoClassDefFoundError: com/sun/mirror/apt/AnnotationProcessorFactory
        at org.codehaus.enunciate.main.EnunciateTask.execute(EnunciateTask.java:93)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
        at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.Target.execute(Target.java:435)
        at org.apache.tools.ant.Target.performTasks(Target.java:456)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
        at org.apache.tools.ant.Main.runBuild(Main.java:851)
        at org.apache.tools.ant.Main.startAnt(Main.java:235)
        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
Caused by: java.lang.ClassNotFoundException: com.sun.mirror.apt.AnnotationProcessorFactory
        at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1374)
        at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1323)
        at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1076)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 17 more
Run Code Online (Sandbox Code Playgroud)

这个问题的原因是什么?

enunciate java-8

7
推荐指数
1
解决办法
6153
查看次数

如何为各种Java类授予不同的权限?

我有一个Java应用程序,我想使它可扩展.要创建扩展,我们公司内的开发人员将编写一个实现特定接口的Java类.他们也可能希望编写相关的帮助程序类.我想在没有中断的情况下将这些扩展加载到应用程序中.

我想限制这个类可以对以下内容做什么:

  1. 在应用程序的API中调用方法(这将是构造函数的参数)
  2. 在同一个包中创建其他对象的实例(因此扩展类的作者可以使用其他类来完成工作).

调用类时,传入的API对象已经定义了"customer"并存储为成员变量.它将使用它来限制通过API访问该客户的数据.

我不希望这些类执行诸如访问数据库,写入磁盘或以其他方式处理等事情.这主要是依赖管理和封装的努力,因为同一个开发人员团队将有权编写扩展和核心系统.

有这种模式吗?我是在正确的轨道上吗?

java security sandbox classpath

6
推荐指数
1
解决办法
5750
查看次数

Hibernate是否适合批量处理?内存使用情况怎么样?

我有一个每日批处理过程,包括选择大量记录和格式化文件以发​​送到外部系统.我还需要将这些记录标记为已发送,以便明天不再传输.

在我天真的JDBC方式中,我会准备并执行一个语句,然后开始遍历记录集.因为我只是通过记录集前进,所以我的应用程序服务器不需要一次将整个结果集保存在内存中.可以从数据库服务器馈送记录组.

现在,让我说我正在使用hibernate.我不会立刻用一堆表示内存中整个结果集的对象结束吗?

memory performance hibernate memory-management jdbc

6
推荐指数
1
解决办法
5290
查看次数

如何在Eclipse中递归查找和运行所有Junit 4测试?

我想在Eclipse项目中运行所有junit 4测试.该项目使用/ source和/ test进行设置.在/ test下是各种包,例如:

com.yaddayadda.test.core.entity
com.yaddayadda.test.core.framework
Run Code Online (Sandbox Code Playgroud)

如果我/test在Package Explorer中右键单击该级别并选择Run As; Junit Test我收到错误:

No tests found with test runner 'JUnit 4'.
Run Code Online (Sandbox Code Playgroud)

如果我右键单击com.yaddayadda.test.core.entity,它会找到并运行该包中的所有测试.所以@Test注释是正确的(它们也在构建服务器上正确地被Ant拾取).但是,如果我尝试在其中运行所有测试,com.yaddayadda.test.core则它找不到任何测试.

基本上,它似乎只是在包内看而不是在所有孩子身上.有没有办法来解决这个问题?

eclipse junit4

6
推荐指数
2
解决办法
3214
查看次数

当一个类只调用另一个有多种方法的类上的一个方法时,如何减少耦合?

我有一个类(让我们称它MyService)在它的构造函数中接受两个依赖项.第一个与问题无关.第二个是PaymentDetails.PaymentDetails的寿命比MyService长,后者由工厂创建以处理此特定请求.

MyService.process(),它:

  • 做一些第一依赖的东西,
  • 构造一个new TransactionDetails()对象并在其上设置各种东西,
  • 电话 myPaymentDetails.setTransactionDetails( td );
  • 返回一些内容,说明接下来的向导中的哪个页面

PaymentDetails必要时有很多方法.它是一个实体样式对象,当用户逐步浏览大约5页时,信息就会建立在该对象中.

困扰我的是,写作我的服务类取决于整个PaymentDetails但只调用一个方法.

这困扰我,因为:

  • 它将限制重用服务类的能力
  • 通过阅读方法签名无法理解真正的依赖关系

我的问题是:

解决此问题的最佳方法是什么,以便我的服务类具有最小的依赖性?

java dependency-injection coupling

6
推荐指数
1
解决办法
4210
查看次数

"EasyMock.expectLastCall();" 在没有进一步调用生成的IExpectationSetters的情况下做任何事情?

请考虑以下代码段: -

Whatever mock = EasyMock.createMock( Whatever.class );
mock.doSomething();
EasyMock.expectLastCall();   // <- Does this do anything?
EasyMock.replay( whatever );
Run Code Online (Sandbox Code Playgroud)

难道expectLastCall()这里实际上做什么吗?在我的测试中添加或删除此行似乎没有任何区别.

显然,如果你在呼叫中添加.andThrow.atLeastOnce()等等,它会很有用.这不是我要问的问题.

easymock void

6
推荐指数
1
解决办法
5340
查看次数