NutzCN Logo
问答 nutz 1.b.51想使用声明式aop,自定义注解无效
发布于 2080天前 作者 qq_e25320ed 1615 次浏览 复制 上一个帖子 下一个帖子
标签:

想使用nutz aop注解,发现1.b.51版本并没有,于是把SimpleAopMaker拷贝过来。
按文档依次编写拦截器、自定义注解,编写单元测试用例。在用单元测试执行方法时候,没有进入拦截器。

@IocBean
public class SayDemo {
	
	@SysLog
	public void sayLove(){
		System.out.println("I love u");
	}
}
public class SayDemoTest extends BaseTest{
	@Inject
	private SayDemo sayDemo;
	@Test
	public void test_sayLove(){
		 sayDemo.sayLove();
	}
}
@IocBy(type=ComboIocProvider.class,args = {
	"*org.nutz.ioc.loader.json.JsonLoader", "ioc/",
	"*org.nutz.ioc.loader.annotation.AnnotationIocLoader", "net.wendal.quartzdemo",
    "net.wendal.quartzdemo.aop.DemoAopLoader"}) // 添加quartz插件引用
@Modules(scanPackage = true)
public class MainModuleForJunitTest {
	
}
public class DemoAopLoader extends SimpleAopMaker<SysLog> {
    public List<? extends MethodInterceptor> makeIt(SysLog sysLog, Method method, Ioc ioc) {
        return Arrays.asList(new SysLogMethodInterceptor());
    }
    class SysLogMethodInterceptor implements MethodInterceptor {
        public void filter(final InterceptorChain chain) throws Throwable {
            System.out.println("hi");
            chain.doChain(); // 继续下一个拦截器, 如果要终止执行,不调用该方法即可
            System.out.println("byte");
        }
    }
}

恢复到1.r.60版本,跑测试用例也没发现进入拦截器。

问题:
1、请问是否只有http请求进来才进声明的拦截器?
2、1.b.51版本想使用,以来办法是否正确?

16 回复

抱歉,疏忽了。
把星号加上,恢复到1.r.60版本能进拦截器。
1.b.51没进拦截器,不知道什么原因。
1.r.60版本日志

[DEBUG] 12:31:41.743 org.nutz.ioc.impl.NutIoc.get(NutIoc.java:209) - 	 >> Make...'sayDemo'<class net.wendal.quartzdemo.aop.SayDemo>
[DEBUG] 12:31:47.921 org.nutz.aop.asm.AsmClassAgent.<clinit>(AsmClassAgent.java:29) - AsmClassAgent will define class in Version 50
[DEBUG] 12:31:47.947 org.nutz.ioc.impl.ScopeContext.save(ScopeContext.java:64) - Save object 'sayDemo' to [app] 
hi
I love u
byte
[INFO ] 12:31:56.105 org.nutz.ioc.impl.NutIoc.depose(NutIoc.java:255) - org.nutz.ioc.impl.NutIoc@237501881 is closing. startup date [18-08-14 12:31:41.696]

1.b.51版本日志:

[DEBUG] 12:33:38.969 org.nutz.ioc.loader.combo.ComboIocLoader.load(ComboIocLoader.java:126) - Found IocObject(sayDemoTest) in IocLoader(AnnotationIocLoader@1949966003)
[DEBUG] 12:33:38.970 org.nutz.ioc.impl.NutIoc.get(NutIoc.java:193) - 	 >> Make...'sayDemoTest'<class net.wendal.quartzdemo.aop.SayDemoTest>
[DEBUG] 12:33:38.972 org.nutz.ioc.aop.impl.DefaultMirrorFactory.getMirror(DefaultMirrorFactory.java:57) - class net.wendal.quartzdemo.aop.SayDemoTest , no config to enable AOP.
[DEBUG] 12:33:38.972 org.nutz.ioc.impl.ScopeContext.save(ScopeContext.java:59) - Save object 'sayDemoTest' to [app] 
[DEBUG] 12:33:38.978 org.nutz.ioc.impl.NutIoc.get(NutIoc.java:144) - Get 'sayDemo'<>
[DEBUG] 12:33:38.978 org.nutz.ioc.impl.NutIoc.get(NutIoc.java:166) - 	 >> Load definition
[DEBUG] 12:33:38.978 org.nutz.ioc.loader.combo.ComboIocLoader.load(ComboIocLoader.java:126) - Found IocObject(sayDemo) in IocLoader(AnnotationIocLoader@1949966003)
[DEBUG] 12:33:38.978 org.nutz.ioc.impl.NutIoc.get(NutIoc.java:193) - 	 >> Make...'sayDemo'<>
[DEBUG] 12:33:38.979 org.nutz.ioc.aop.impl.DefaultMirrorFactory.getMirror(DefaultMirrorFactory.java:57) - class net.wendal.quartzdemo.aop.SayDemo , no config to enable AOP.
[DEBUG] 12:33:38.979 org.nutz.ioc.impl.ScopeContext.save(ScopeContext.java:59) - Save object 'sayDemo' to [app] 
I love u
[DEBUG] 12:33:39.086 org.nutz.ioc.impl.ScopeContext.clear(ScopeContext.java:91) - Depose object 'sayDemoTest' ...
[DEBUG] 12:33:39.087 org.nutz.ioc.impl.ScopeContext.clear(ScopeContext.java:91) - Depose object 'sayDemo' ...

好像是新版才支持$aop_前缀,老版本只找$aop

那您的意思是?还有办法吗,在不升级版本的情况下。因为以前的同事,听说改了这个版本的源码,但是不知道改了什么,也找不到人。所以版本升级不好做。

用js来声明$aop试试

或者这样,你改一改SimpleAopMaker,返回的bean名字改成$aop,当前应该是$aop_注解名

js声明$aop之前有用过。这个bean 名称$aop在原项目已经被占用。
在demo项目中把DemoAopLoader名字指定为@IocBean(name="$aop"),拦截器就生效了。
debug了一下代码,原来对aop好像是写死的判断,跟你说的一样,是找$aop。
如果是这样的话旧版本可能不能同时使用js声明$aop和自定义注解了。

有,就是改定义$aop的配置,继承它,改造一下

其实我现在做的是把tcc-transation项目的aop改造成咱们nutz的aop。
刚想到一个办法,是用方法的拦截器。

//@SysLog
	@Aop({"sysLogMethodInterceptor"}) 
	public void sayLove(){
		System.out.println("I love u");
	}

经测试,好像实现效果一样,就是加多一个注解的问题。
真想说,很想升级版本。不然真的难受。

话说,是不是aop.js里面直接声明拦截器就好了,需要传配置参数吗?

$aop适合有规律包名、类名、方法名,配置。
如:

['com\\.xjc\\.p2p\\.charge\\.biz\\..+','.+','ioc:txREAD_COMMITTED']

但是对于不规律的,不好操作。工程太大的情况下,可能还要不定时去维护配置。
感觉注解方式有它不可替代的地方。

我记得那个版本也有comboaop'config吧?

有,ComboAopConfigration。但是这个没用到。

可以试试😄

文档没有哦,有没有介绍资料

看源码吧, 就是组合而已

添加回复
请先登陆
回到顶部