我一直在寻找一些Ruby依赖注入库.特别是,我检查了 Needle和Copland.他们已经存在了很长一段时间,但并没有很多用法.
使用这两个库有哪些优点和缺点?看起来好像很多库/框架都可以很好地利用这两个库,例如Merb/Datamapper的Hook.
我记得在20世纪90年代末和21世纪初,面向方面编程(AOP)被认为是"下一件大事".现在我看到一些AOP仍然存在,但它似乎已经消失在后台.
更新5:我已经下载了基于最新Eclipse的最新Spring ToolsSuite IDE.当我将项目导入为Maven项目时,Eclipse/STS似乎使用Maven目标来构建我的项目.这意味着AspectJ最终在Eclipse中正常工作.
更新4:我最终只是使用Maven + AspectJ插件进行编译时编织,有效地绕过了Eclipse的机制.
更新3:似乎AspectJ的Eclipse插件破坏了Eclipse正确发布到Tomcat的能力.只有删除项目中的AspectJ功能,才能让它再次正确发布.很烦人.
更新2:我现在在Eclipse中工作了.这让我感到非常不舒服,但我不知道我是如何使用Eclipse或Maven构建的.它似乎是一个编译问题而不是运行时问题.
更新1:看来我已经通过Maven构建工作了,但我不知道如何.Eclipse仍然无法正常工作.我在pom.xml中唯一改变的是添加这些(无关紧要的?)配置参数:
<source>1.6</source>
<complianceLevel>1.6</complianceLevel>
<verbose>true</verbose>
<showWeaveInfo>true</showWeaveInfo>
<outxml>true</outxml>
Run Code Online (Sandbox Code Playgroud)
我实际上担心我会重复这个问题,一切都不一致.随着我了解更多信息,我会更新此问题.
关于Eclipse,我通过采用我想编织的二进制方面取得了一些进展 - 在本例中是spring-aspects.jar - 并将其复制出我的类路径.然后我将这个外部jar添加到我的Aspect Path中.执行此操作后,Eclipse在我的代码中正确显示了AspectJ标记.令人讨厌的是,我不能将spring-aspects.jar留在我的Java Build Path中,这是由Maven通过Maven插件为我维护的.但是,出于某种原因,除非将AspectJ插件显式添加到Aspect Path,否则AspectJ插件不会看到二进制方面.
原始帖子: @Configurable是一个Spring注释,它允许将依赖项注入到Spring外部实例化的对象中(例如,通过Hibernate或某些Factory类).
我以前使用这个注释与加载时编织,它主要工作.偶尔我会启动,没有任何东西会被注入.这个问题催生了这个StackOverflow问题.答案并不多,但大多数人建议我尝试编译时编织,因为可靠性更高.
我为Eclipse和Maven安装了AspectJ插件.这两个产生的似乎是正确编译的类.我在AspectJ编译之前在文本编辑器中打开了其中一个类,但未发现对AspectJ的引用.我在AspectJ编译后打开它,Eclipse和Maven生成的版本都引用了org.aspectj.weaver.MethodDeclarationLineNumber.这就是我认为它被正确编译的原因.问题是,一旦部署,就不会注入依赖项.
My Spring applicationContext.xml确实包含以下内容:
<context:spring-configured />
<context:component-scan base-package="com.myapp" />
Run Code Online (Sandbox Code Playgroud)
以上所有标记为@Configurable的类都需要完成DI吗?在从加载时编织到编译时编织的转换过程中,我从applicationContext.xml中删除了META-INF/aop.xml,<context:load-time-weaver />,从我的context.xml中删除了Spring的Tomcat编织器.
我该如何进一步调查此问题?可能的原因是什么?
将横切关注点注入类中的不同方法有哪些,以便在保持代码可测试(TDD或其他)的同时最小化所涉及的类的耦合?
例如,考虑我是否有一个需要日志记录功能和集中式异常管理的类.我应该使用DIP并通过接口将所需的关注点注入需要它们的类中吗?我是否应该使用我传递给每个需要一些交叉功能的类的服务定位器?是否有完全不同的解决方案?我完全问错了吗?
可能重复:
Python的任何AOP支持库?
我熟悉AspectJJava语言的扩展.
我想知道Python是否有这样的东西.
不要误解我的意思,我不是指库,而是像AspectJJava 那样的语言扩展.
我正在使用java配置@ComponentScan来初始化我的bean并@EnableAspectJAutoProxy(proxyTargetClass=true)使用cglib代理.
在这个项目中,我们使用了很多生成的服务@Autowired.它工作得很好.
但是,对于我添加的其中一些服务@Async(我也在@EnableAsync(proxyTargetClass = true)我的@Configuration课程中添加了).
在那之后,我得到:
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'ConversationUserLocalService': Bean with name 'ConversationUserLocalService' has been injected into other beans [ConversationUserHistoryLocalService] i
n its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider …Run Code Online (Sandbox Code Playgroud) 有没有人在生产环境中使用Postsharp AOP框架?有任何陷阱吗?为了做一些日志记录等,Postsharp可以和Log4Net一起使用吗?
任何有关使用Postsharp与Web Apps和/或Log4Net的教程都将受到高度赞赏.
提前致谢.
我有两个注解@LookAtThisMethod和@LookAtThisParameter,如果我身边有方法的切入点与@LookAtThisMethod我怎么能提取其标注了该方法的参数@LookAtThisParameter?
例如:
@Aspect
public class LookAdvisor {
@Pointcut("@annotation(lookAtThisMethod)")
public void lookAtThisMethodPointcut(LookAtThisMethod lookAtThisMethod){}
@Around("lookAtThisMethodPointcut(lookAtThisMethod)")
public void lookAtThisMethod(ProceedingJoinPoint joinPoint, LookAtThisMethod lookAtThisMethod) throws Throwable {
for(Object argument : joinPoint.getArgs()) {
//I can get the parameter values here
}
//I can get the method signature with:
joinPoint.getSignature.toString();
//How do I get which parameters are annotated with @LookAtThisParameter?
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用方面的lib,可以通过maven获得,现在我正在尝试在Android应用程序中使用该lib.
如果我在app gradle文件中包含此插件,一切正常,但我的目标是将my classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.+'和apply plugin: 'android-aspectj'插件所需的(和插件所需)解压缩到my.lib gradle文件而不是在我的应用程序中声明.
那可能吗?
app gradle文件:
classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.+'
apply plugin: 'android-aspectj'
dependencies {
compile 'my.lib:example:1.0.0'
}
Run Code Online (Sandbox Code Playgroud)
目标:
app gradle文件:
dependencies {
compile 'my.lib:example:1.0.0'
}
Run Code Online (Sandbox Code Playgroud)
my.lib gradle文件:
classpath 'com.uphyca.gradle:gradle-android-aspectj-plugin:0.9.+'
apply plugin: 'android-aspectj'
dependencies {
compile 'org.aspectj:aspectjrt:1.7.3'
}
Run Code Online (Sandbox Code Playgroud)