|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
认真的记,感觉很紧张根本就没有时间和能力,来对技术知识点进行思考。这样课下就只能对知识进行简单的理解,其实简单的理解就是记忆课堂上讲的知识点,j2se|条记|数据办法和正文
要把你的JAVA代码和AOP分离起来,可使用一些标签,就像新的JDK5.0版本中的元数据和XDoclet
。关于你的JAVA办法,就有点像利用synchronized一样。当你把你的办法标注为synchronized,就标明
你高数JVM你的这个办法在实行的利用是必要同步的。正文标签同意你界说新的关头词用来处置你本人
的特别举动。AOP就使你有了把这些织进到你的使用中,以使使用能够实行的才能。
让我们看看我们利用本人界说的标签@Oneway来使一个办法在背景的别的一个线程实行。
importorg.jboss.aspects.Oneway;
publicclassFoo
{
@OnewaypublicstaticvoidsomeMethod(){...}
publicstaticvoidmain(String[]args)
{
someMethod();//executesinbackground
}
}
当我们的MAIN办法挪用Msomeethod办法的时分,肇端它的实行是和MAIN办法平行的别的一个同步办法中
实行。
要实行这个类,我们必需起首界说本人的标签到JAVA语法中。
packageorg.jboss.aspects;
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Target;
@Target({ElementType.METHOD})
public@interfaceOneway{}
这就够了。@Target能够限定你的标签的使用局限。在这里你的Oneway就只能被用于办法。下面这些
是地道的J2SE5.0内里使用。
上面的是我们的方面,用来实行@Oneway的举动。
packageorg.jboss.aspects;
publicOnewayAspect
{
privatestaticclassTaskimplementsRunnable
{
privateMethodInvocationinvocation;
publicTask(MethodInvocationinvocation)
{
this.invocation=invocation;
}
publicvoidrun()
{
try{invocation.invokeNext();}
catch(Throwableignore){}
}
}
publicObjectoneway(MethodInvocationinvocation)throwsThrowable
{
MethodInvocationcopy=invocation.copy();
Threadt=newThread(newTask(copy));
t.setDaemon(false);
t.start();
returnnull;
}
}
我们的方面就是这么复杂。
最初就是我们要界说切进点
<aop>
<aspectclass="org.jboss.aspects.OnewayAspect"/>
<bindpointcut="execution(void*->@org.jboss.Oneway(..))">
<advicename="oneway"
aspect="org.jboss.aspects.OnewayAspect"/>
</bind>
</aop>
这个界说标明了只要是void的被标注为@Oneway的办法才被我们OnewayAspect实行。如许就能够把你
别的使用加上往,这就是复杂,明晰,便利的JAVA预言。
字段和正文
经由过程AOP我们也能够界说我们本人的字段意义,比方我们能够界说一个ThreadLocal的字段,假如
利用之前的办法,我们就必需利用良多GET()和SET()才干完成。而如今我们能够间接界说一个
@ThreadLocal的范例。
要利用这个新的范例能够像如许:
importorg.jboss.aspects.Threadbased;
publicclassFoo
{
@Threadbasedprivateintcounter;
}
起首我们要界说这个范例
packageorg.jboss.aspects;
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Target;
@Target({ElementType.FIELD})
public@interfaceThreadbased{}
如许就能够了,如今一切被标注为@Threadbased的字段都将被使用到这里来,但这里限定了此范例
只能用户字段。
上面就是完成我们的方面来做详细的事情。
packageorg.jboss.aspects;
importorg.jboss.aop.joinpoint.*;
importjava.lang.reflect.Field;
publicclassThreadbasedAspect
{
privateThreadLocalthreadbased=newThreadLocal();
publicObjectaccess(FieldReadInvocationinvocation)
throwsThrowable
{
//justincasewehaveaprimitive,
//wecantreturnnull
if(threadbased.get()==null)
returninvocation.invokeNext();
returnthreadbased.get();
}
publicObjectaccess(FieldWriteInvocationinvocation)
throwsThrowable
{
threadbased.set(invocation.getValue());
returnnull;
}
}
最初界说切进点
<aop>
<aspectclass="org.jboss.aspects.ThreadbasedAspect"
scope="PER_JOINPOINT"/>
<bindpointcut="field(**->@org.jboss.aspects.Threadbased)">
<advicename="access"
aspect="org.jboss.aspects.ThreadbasedAspect"/>
</bind>
</aop>
我们的但愿是为每一个字段都举行实例化的时分使之成为一个Threadlocal的静态变量,以是在
界说切进点的时分我们利用了PER_JOINPOINT,让JBOSSAOP晓得为我们每一个字段都要实例化
一个新的ThreadLocal,不然JBOSSAOP只会我们实例化一个ThreadbasedAspect,假如如许就
会让一切的字段共享一个Threadlocal,这分明不是我们所希冀的。
和下面一样,在这里我们看到了洁净的,简单集成的办法完成了界说新的JAVA范例。
但是对于JAVA技术类的学习,我觉得大课堂反而会影响自身独立思考的过程,因为上课的时候,老师讲课的速度很快为了不遗漏要点,通常会仔细的听, |
|