在一篇名为"AOP Fundamentals"的文章中,我要求King的英文解释AOP是什么,以及它做了什么.我收到了一些非常有用的答案和链接到文章,这些文章帮助我了解了所有理论.
但是现在AOP得到了我的全部关注,所有这些文章和章节摘录都很棒,但在每一个案例中,它们都包含了崇高的理论,模糊的UML模型,以及抽象的顺序,这些都是我喜欢的.
这是我对AOP理论的理解,只是为了澄清,所以如果你看到一些看起来不对的东西,请告诉我!
诸如日志记录,身份验证,同步,验证,异常处理等交叉问题在非AOP系统中变得高度耦合,因为它们几乎被代码库中的每个组件/模块使用.
AOP定义了使用连接点,建议和切入点来抽象这些横切关注点的方面(类/方法).
一个.建议 - 实现跨领域关注(即进行实际记录,验证,验证等)的实际代码(方面的方法,可能?)
湾 加入点 - 在非AOP代码中触发的事件,导致特定方面的建议被执行("编织"到非AOP代码中)
C.切入点 - 基本上是连接点(触发事件)到建议执行的映射
所有方面都模块化(LoggingAspect,AuthenticationAspect,ValidationAspect等)到组件中并使用AspectWeaver注册.当非AOP/POJO代码遇到连接点时,AspectWeaver会围绕非AOP代码"编织"(集成)映射的建议:
public class LoggingAspect { // ... public void log(String msg) { ... } } public class ExceptionHandlingAspect { // .. public void handle(Exception exc) { ... } } public class NonAOPCode { // ... @LoggingAspect @ExceptionHandlingAspect public void foo() { // do some stuff... …
面向方面的编程是我很难找到任何好的信息的主题.我的旧软件工程教科书只是简单地(和模糊地)提到它,维基百科和我能够在其上找到的各种其他教程/文章给出了超学术,高度抽象的定义,它是什么,如何使用它,何时使用它.定义我似乎并不理解.
我(非常差)对AOP的理解是,生成高质量软件系统的许多方面都不能很好地融入一个漂亮的小内聚包中.一些类,如Loggers,Validators,DatabaseQueries等,将在您的代码库中使用,因此将是高度耦合的.我对AOP的理解(再次,非常差)是它关注如何处理这些类型的"通用耦合"包的最佳实践.
问题:这是真的,还是我完全没有?如果我完全错了,有人可以给出简明扼要的解释,说明AOP是什么,所谓的方面的例子,甚至可能提供一个简单的代码示例?
我一直在阅读基本的网络编程,但我很难找到关于究竟和套接字是什么的直接解释,以及它与OSI或TCP/IP堆栈的关系.
有人可以向我解释插座是什么吗?它是程序员或API定义的数据结构,还是网卡上的硬件设备?
所提到的网络模型的哪些层面处理"原始"套接字?传输层?网络层?
就他们在它们之间传递的数据而言,是基于套接字文本还是二进制文件?
是否有基于套接字的网络编程的替代方案?或者所有联网应用程序都使用某种形式的套接字?
如果我能得到这么多,我应该非常清楚地理解我正在读的其他一切.谢谢你的帮助!
我正处于构建Java EE应用程序的需求阶段,该应用程序很可能在GlassFish/JBoss后端运行(现在无关紧要).我知道我不应该在需求时考虑架构,但人们不禁开始想象组件是如何全部拼凑在一起的:-)
以下是客户端的一些硬性,非灵活性要求:
(1)客户端应用程序将是一个Swing框
(2)客户端可以免费下载,但将使用订阅模型(因此需要与服务器的登录机制)侧认证/授权等)
(3)是的,Java是最好的了手头的问题这篇文章的范围之外的平台解决方案的原因
(4)客户端的.class文件需要维护反编译
最后(第4个)要求是这篇文章的基础.
我并不是真的担心有人会实际反编译并获取我的源代码:最后,它只是由一些轻量级业务逻辑驱动的Swing控件.
我担心会有人反编译我的代码,修改它以利用/攻击服务器,重新编译并激活它.
我设想了各种令人讨厌的解决方案,但不知道这是否是Java EE开发人员常见解决方案的常见问题.有什么想法吗?
对"代码混淆"技术不感兴趣!
感谢您的任何意见!
我真的卷起袖子,试图第一次理解Java注释,并阅读了有关该主题的Sun,Oracle和Wikipedia文章.它们在概念上很容易理解,但我发现将拼图的所有部分放在一起很困难.
以下示例可能是可怕的工程,但只是幽默我(这是一个例子!).
假设我有以下课程:
public Widget { // ... public void foo(int cmd) { switch(cmd) { case 1: function1(); break; case 2: function2(); break; case 3: default: function3(); break; } } }
现在,在我项目的其他地方,我有另一个类SpaceShuttle,它有一个名为blastOff()的方法:
public class SpaceShuttle { // ... public void blastOff() { // ... } }
那么现在,我想配置称为注释Widgetize使之与注释的任何方法@Widgetize将之前自己的呼叫的Widget :: foo的(INT)调用.
@interface Widgetize { int cmd() default 2; }
那么现在让我们重新审视SpaceShuttle:
public class SpaceShuttle { // ... @Widgetize(3) public void blastOff() { // …