我用Spring AOP写了一个非常简单的Aspect.它有效,但我在理解真正发生的事情时遇到了一些问题.我不明白为什么我要添加aspectjweaver.jar?Spring-AOP文档明确指出,只要我使用Spring-AOP,我就不需要aspectj编译器或weaver:
AOP运行时仍然是纯Spring AOP,并且不依赖于AspectJ编译器或weaver.
我的配置如下所示:
<aop:aspectj-autoproxy />
@Aspect
@Service
public class RemoteInvocationAspect {
@Before("execution(* at.test.mypackage.*.*(..))")
public void test() {
System.out.println("test");
}
...
Run Code Online (Sandbox Code Playgroud)
我也尝试过XML配置,虽然没有改变任何东西.也许我可以放手,但我真的想了解为什么使用aspectj-weaver?如果我没有在maven中添加依赖项,我会得到 java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
当我注意到我的客户端应用程序(基于Swing)上使用疯狂的高RAM时,我开始研究它,看起来这与Spring中基于Annotation的配置有某种关系.正如您将在下面的编辑中看到的那样,我意识到这只发生在64位JVM上.
请参阅以下测试代码:
基于xml的配置
<beans ....>
<bean id="xmlConfigTest" class="at.test.XmlConfigTest" />
</beans>
public class XmlConfigTest extends JFrame {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("config/applicationContext.xml");
XmlConfigTest frame = (XmlConfigTest) ctx.getBean("xmlConfigTest");
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
使用大约32MB内存,这对我来说似乎没问题.
现在与基于注释的配置相同:
@Service
public class AnnotationConfigTestFrame extends JFrame {
public static void main(String[] args) throws InterruptedException {
ApplicationContext ctx = new AnnotationConfigApplicationContext("at.test");
AnnotationConfigTestFrame frame = (AnnotationConfigTestFrame) ctx
.getBean("annotationConfigTestFrame");
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
打开相框不仅要花费更长的时间,而且在启动时内存消耗量会升至160MB内存,然后在大约152MB处达到平衡,这对我来说似乎非常高.请记住,这只是最基本的情况,我开发的客户端应用程序已经超过400MB,这对于旧机器来说太多了.
有没有人对这种行为有解释?我不明白..
(在这里使用3.1.1.RELEASE顺便说一下.)
编辑* 正如axtavt所建议的,我还尝试直接用Test-Class作为Argument构造AnnotationConfigApplicationContext,这样就不需要类路径扫描.遗憾的是,没有改变内存消耗.
编辑2已删除,请参阅编辑3
编辑3 我现在使用32位和64位JVM以及上面的测试程序在同一台机器(Windows 7 …
关于Java Desktop-gui-applications,我有一个非常笼统的问题。
我的经验: 在过去的几年中,我开发了许多桌面应用程序,其中一些单独使用Swing,一些使用Spring-RCP(这很棒,但是我不能只赌一个尚未更新超过3个的框架)年了)。我也在看Valkyrie RCP,但是在我看来,那里也确实没有那么多动作。我还使用Wicket,Tapestry和最近的JSF2(Primefaces)开发了Web应用程序。在Web应用程序方面积累了一些经验后,我感觉Java桌面GUI已被放弃很久了。当然,我以前没有注意到这一点,但是在开发了Web应用程序之后,我真的看到直接比较桌面uis是多么痛苦和复杂。
我正在寻找的是: 我在这里没有做任何火箭科学,我最想念的是一种构建以下简单布局形式的简便方法
label_a input_a feedbackMessage_a
label_b input_b feedbackMessage_b
....
button_save
Run Code Online (Sandbox Code Playgroud)
这不仅与布局有关,而且可能是最小的问题。首先,我正在寻找一种将输入字段的值“绑定”到某种“ backing-bean-fields”的方法。我也想使用直接反馈,这意味着如果对input_a的验证失败,我希望在feedbackMessage_a上显示一条消息,而在其他任何地方。第三,我想在此直接反馈中使用JSR-303验证。如果我深入研究典型桌面应用程序的源代码,通常会看到每个按钮都有一个巨大的动作监听器,其中所有值分配,验证和反馈消息创建都是手动编写的。将此与诸如挂毯或jsf2之类的网络框架进行比较。您在那里要做的就是使用某种表达式语言将输入字段“绑定”到变量/字段,就是这样。该值正在得到验证(例如 使用JSR-303注释)和(如果所有值都有效)自动传递到支持Bean的绑定字段中。同样,如果发生验证错误,则会创建一条验证消息,其中输入字段的ID用于标识负责的输入字段。如果存在用于该特定ID的消息组件,则在此处设置验证消息。这是顺理成章的。
现在回到桌面GUI;为了有一个可比的用户界面,比如说一个带有20个输入字段的表单,我可能需要500行侦听器代码,首先我自己读取每个文本字段的值,然后对其进行验证并将其写入相应的变量中。如果我要使用JSR-303,我可以自己打电话给验证器,但是回溯到相应的输入字段并在那里设置反馈消息会很麻烦。很痛苦,不是吗?
我的问题: 有什么方法可以减轻疼痛?您如何开发现代桌面应用程序?您使用什么框架,为什么?是否有可能使用类似webframeworks的绑定方式?如上所述,我如何实现“直接反馈”?我是否错过了这里的培训,或者在过去几年中编写Web应用程序变得更加简单,而Java桌面似乎停滞了呢?(除了JavaFx,但这对我没有帮助)
结束语 别误会,我是Java桌面应用程序的忠实拥护者。在一个我正在工作的中等规模的公司中,在同类环境中(所有客户端都安装了相同的Java版本,依此类推),我真的没有看到Web应用程序的收益。使用webstart,该应用程序启动非常快(当然,在首次下载后)。在我看来,尽管Java中以前端为中心的webframeworks以光速前进,但java-desktop几乎没有动。尽管我可以忍受这样的方式,但我确实必须问这个问题。
嗨我有关于MD5 Hash/Salting的问题.
我最近阅读了很多关于散列和盐析的内容,我明白我应该为每个密码使用不同的盐,并且我不应该使用像用户名这样的东西,因为理想情况下盐应该是完全独特的.但我不明白为什么建议将这个盐与密码一起存储在数据库中?
如果攻击者获得哈希和盐,这不是很糟糕吗?我理解攻击者更难,因为独特的盐确保他无法检查所有密码的单个计算哈希值.但是,保持盐的一部分隐藏不是更好吗?
我想到将盐分成两部分.第一部分像往常一样存储在数据库中,第二部分(较小)部分在我的应用程序中硬编码.攻击者几乎不可能获得完整的盐,因为他必须渗透应用程序服务器和数据库.
这是一个好的解决方案吗?盐仍然是独特的,但所有的盐都以相同的顺序结束.
我有关于HashMap同步的问题.背景是我试图实现一种简单的暴力检测方法.我将使用一个用户名作为密钥的地图,用于保存用户登录尝试失败的次数.如果登录失败,我想做这样的事情:
Integer failedAmount = myMap.get("username");
if (failedAmount == null) {
myMap.put("username", 1);
} else {
failedAmount++;
if (failedAmount >= THRESHOLD) {
// possible brute force detected! alert admin / slow down login
// / or whatever
}
myMap.put("username", failedAmount);
}
Run Code Online (Sandbox Code Playgroud)
我现在想到的机制非常简单:我只会跟踪这一整天并在午夜清除()HashMap或类似的东西.
所以我的问题是:我可以使用的最佳/最快的Map实现是什么?我需要一个完全同步的Map(Collections.sychronizedMap())还是一个ConcurrentHashMap足够?或者甚至只是一个普通的HashMap?我想如果一些增量减少的话,这不是什么大问题吗?
我正在开发一个需要推送通知的 PWA。遗憾的是 IOS/Safari目前不支持https://w3c.github.io/push-api/#pushmanager-interface ,所以我想我可能必须以某种方式包装一个本机应用程序。
在 Android 中(在“受信任的 Web 活动”出现之前),您可以使用 WebView 基本上在您的应用程序中显示无头 Chrome 视图。IOS 中的等效项是什么以及推送通知和 Webapp 之间的交互(浏览器需要跳转到特定页面)如何工作?
我还需要的一件事是与我们公司的移动设备管理(即 Microsoft Intune)集成。过去在 Android 中集成了 MDM,我知道这可能是一个主要的痛苦,所以我正在考虑自己构建包装器,以获得最大的灵活性。另一种选择是类似 Ionic 的东西,现在不确定。
push-notification apple-push-notifications ios ionic-framework progressive-web-apps
我现在使用这样的东西:JSF2(PrimeFaces)+ Spring&Spring-Security + JPA2(Hibernate).我就喜欢!但不知怎的,我总是想知道:具有Hibernate的特定Spring版本的推荐(或者可能是"最佳兼容")版本是什么?我们以Spring 3.2.6为例:
如果我看一下spring-orm POM,它似乎使用了hibernate-entitymanager 4.1.9.Final.我应该使用那个,还是最新的4.1.x版本?或者我应该使用hibernate 4.2.x?甚至4.3.x?在我的(简单)测试中,任何工作都很好,但后来我在这里阅读https://jira.springsource.org/browse/SPR-11240,直到春季4才支持hibernate 4.3.
总结一下:我应该使用哪个hibernate版本的spring 3.2.6.RELEASE以及找到类似信息的最佳位置(未来).
java ×4
spring ×3
aop ×1
aspectj ×1
cryptography ×1
hash ×1
hibernate ×1
ios ×1
jgoodies ×1
jpa ×1
jvm ×1
md5 ×1
security ×1
spring-aop ×1
spring-rcp ×1
swing ×1
synchronized ×1