我有一段时间想知道一些软件如何隐藏秘密密钥,以至于无法轻易发现它们.举几个例子:
显然,这些程序不仅仅是在字节[]中使用密钥,因为这样可以轻松窃取密钥并生成自己的序列号等.
使用了哪些策略来隐藏这些键,以便无法轻易找到它们?
我想将FactoryBeans和范围一起使用.具体来说,我希望FactoryBean创建并返回的对象放在指定的(可能是自定义的)范围内.问题是执行以下操作:
<bean class="x.y.z.TestFactoryBean" scope="test" />
Run Code Online (Sandbox Code Playgroud)
FactoryBean本身的结果是作用域,并且对工厂创建的对象有一些不可预测的行为.我明白为什么会这样; 工厂本身是一流的春季管理的豆,并有自己的生命周期.但是,我找不到一种方法来指定从工厂返回的对象本身应该作用域.
另一方面,这正是我想要的(只要TestFactoryBean不实现FactoryBean接口):
<bean class="x.y.z.TestFactoryBean" name="testFactory">
<bean class="x.y.z.TestBean" factory-bean="testFactory"
factory-method="getObject" scope="test" />
Run Code Online (Sandbox Code Playgroud)
所以真正的问题是,我如何使Spring的行为与上面的第二个例子一样,但是使用真正的FactoryBeans?
这个问题的核心是一个设计问题.我将使用Java/Java EE示例来说明问题.
考虑一个使用JPA构建的Web邮件应用程序,用于服务层的持久性和EJB.假设我们的EJB中有一个服务方法,如下所示:
public void incomingMail(String destination, Message message) {
Mailbox mb = findMailBox(destination); // who cares how this works
mb.addMessage(message);
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一种合理的商业方法.据推测,邮箱对象仍将被附加,它将无缝地将更改保存回数据库.毕竟,这是透明持久性的承诺.
邮箱对象将具有此方法:
public void addMessage(Message message) {
messages.add(message);
}
Run Code Online (Sandbox Code Playgroud)
这里变得复杂 - 假设我们想要其他邮箱类型.假设我们有一个自动响应发件人的AutoRespondingMailbox,以及一个HelpDeskMailbox,它会在收到每封电子邮件时自动打开一个帮助台票证.
自然要做的是扩展Mailbox,其中AutoRespondingMailbox具有以下方法:
public void addMessage(Message message) {
String response = getAutoResponse();
// do something magic here to send the response automatically
}
Run Code Online (Sandbox Code Playgroud)
问题是我们的Maibox对象及其子类是"域对象"(在本例中,也是JPA实体).Hibernate人(以及许多其他人)宣扬非依赖域模型 - 即不依赖于容器/运行时提供的服务的域模型.这种模型的问题是AutoRespndingMailbox.addMessage()方法无法发送电子邮件,因为它无法访问,例如,JavaMail.
HelpDeskMailbox会出现完全相同的问题,因为它无法访问WebServices或JNDI注入以与HelpDesk系统进行通信.
因此,您不得不将此功能放在服务层中,如下所示:
public void incomingMail(String destination, Message message) {
Mailbox mb = findMailBox(destination); // who cares how this works
if (mb instanceof …Run Code Online (Sandbox Code Playgroud)