You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

README-190.html 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  2. <html> <head>
  3. <title>AspectJ 1.9.0.RC4 Readme</title>
  4. <style type="text/css">
  5. <!--
  6. P { margin-left: 20px; }
  7. PRE { margin-left: 20px; }
  8. LI { margin-left: 20px; }
  9. H4 { margin-left: 20px; }
  10. H3 { margin-left: 10px; }
  11. -->
  12. </style>
  13. </head>
  14. <body>
  15. <div align="right"><small>
  16. &copy; Copyright 2018 Contributors.
  17. All rights reserved.
  18. </small></div>
  19. <p>The full list of resolved issues in 1.9.0 is available
  20. <a href="https://bugs.eclipse.org/bugs/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&f0=OP&f1=OP&f3=CP&f4=CP&j1=OR&list_id=16866879&product=AspectJ&query_format=advanced&target_milestone=1.9.0">here</a></h2>.</p>
  21. <h1>AspectJ 1.9.0.RC4</h1>
  22. <p>Primary changes in RC4 are to add support for &lt;compilerArg&gt; in the Ant task. This enables users of the Ant task to
  23. pass in options supported by the underlying AspectJ but not yet surfaced elsewhere. Particularly useful with Java9 which includes
  24. a number of module related commands. For example, here is an iajc usage with compilerArg that is passing <tt>--add-modules java.xml.bind</tt>:
  25. <pre><code>
  26. &lt;iajc destdir="bin" failonerror="true"
  27. showWeaveInfo="true" source="1.9" target="1.9"
  28. debug="true" fork="true" maxmem="256m"&gt;
  29. &lt;compilerArg value="--add-modules"/&gt;
  30. &lt;compilerArg value="java.xml.bind"/&gt;
  31. &lt;src path="src" /&gt;
  32. &lt;classpath&gt;
  33. &lt;pathelement location="${aspectj.home}/lib/aspectjrt.jar"/&gt;
  34. &lt;/classpath&gt;
  35. &lt;/iajc&gt;
  36. </code></pre>
  37. <li>1.9.0.RC4 available 21-Feb-2018</li>
  38. <h1>AspectJ 1.9.0.RC3</h1>
  39. <p>Primary changes in RC3 are to upgrade JDT and pickup all the fixes for Java9 that have gone into it over the last few months.</p>
  40. <li>1.9.0.RC3 available 5-Feb-2018</li>
  41. <h1>AspectJ 1.9.0.RC2</h1>
  42. <ul>
  43. <li>1.9.0.RC2 available 9-Nov-2017
  44. </ul>
  45. <p>Key change in 1.9.0.RC2 is actually to be more tolerant of JDK10. The version handling has been somewhat overhauled so AspectJ 9 will
  46. behave better on Java 10 and future JDKs. This should put AspectJ in a better place if new JDK versions are going
  47. to arrive thick and fast.
  48. <h1>AspectJ 1.9.0.RC1</h1>
  49. <ul>
  50. <li>1.9.0.RC1 available 20-Oct-2017
  51. </ul>
  52. <p>This is the first release candidate of AspectJ 1.9.0 - the version of AspectJ to be based on Java9. It includes
  53. a recent version of the Eclipse Java9 compiler (from jdt core, commit #062ac5d7a6bf9).</p>
  54. <h4>Automatic Modules</h4>
  55. <p>AspectJ can now be used with the new module system available in Java9. The key jars in AspectJ have been given automatic module names.
  56. The automatic module name is <tt>org.aspectj.runtime</tt> for the <tt>aspectjrt</tt> module:</p>
  57. <pre><code>
  58. $ java --module-path &lt;pathto&gt;/lib/aspectjrt.jar --list-modules | grep aspectj
  59. org.aspectj.runtime file:///&lt;pathto&gt;/lib/aspectjrt.jar automatic
  60. </code></pre>
  61. <p>And similarly <tt>org.aspectj.weaver</tt> and <tt>org.aspectj.tools</tt> for <tt>aspectjweaver</tt> and <tt>aspectjtools</tt> respectively:</p>
  62. <pre><code>
  63. $ java --module-path &lt;pathto&gt;/lib/aspectjweaver.jar --describe-module org.aspectj.weaver
  64. org.aspectj.weaver file:///&lt;pathto&gt;/lib/aspectjweaver.jar automatic
  65. requires java.base mandated
  66. contains aj.org.objectweb.asm
  67. contains aj.org.objectweb.asm.signature
  68. contains org.aspectj.apache.bcel
  69. contains org.aspectj.apache.bcel.classfile
  70. contains org.aspectj.apache.bcel.classfile.annotation
  71. contains org.aspectj.apache.bcel.generic
  72. contains org.aspectj.apache.bcel.util
  73. contains org.aspectj.asm
  74. contains org.aspectj.asm.internal
  75. ...
  76. </code></pre>
  77. </p>
  78. <br><br>
  79. <h4>Building woven modules</h4>
  80. <p>AspectJ understands module-info.java source files and building modules that include aspects. Here is an example:</p>
  81. <pre><code>
  82. <b>module-info.java</b>
  83. module demo {
  84. exports pkg;
  85. requires org.aspectj.runtime;
  86. }
  87. <b>pkg/Demo.java</b>
  88. package pkg;
  89. public class Demo {
  90. public static void main(String[] argv) {
  91. System.out.println("Demo running");
  92. }
  93. }
  94. <b>otherpkg/Azpect.java</b>
  95. package otherpkg;
  96. public aspect Azpect {
  97. before(): execution(* *(..)) && !within(Azpect) {
  98. System.out.println("Azpect running");
  99. }
  100. }
  101. </code></pre>
  102. <p>We can now build those into a module:</p>
  103. <pre><code>
  104. $ ajc -1.9 module-info.java otherpkg/Azpect.java pkg/Demo.java -outjar demo.jar
  105. ...
  106. module-info.java:3 [error] org.aspectj.runtime cannot be resolved to a module
  107. ...
  108. </code></pre>
  109. <p>Wait, that failed! Yes, <tt>aspectjrt.jar</tt> (which includes the required <tt>org.aspectj.weaver</tt> module) wasn't supplied.
  110. We need to pass it on the module-path:</p>
  111. <pre><code>
  112. $ ajc -1.9 --module-path &lt;pathto&gt;/aspectjrt.jar module-info.java otherpkg/Azpect.java pkg/Demo.java -outjar demo.jar
  113. </code></pre>
  114. <p>Now we have a demo module we can run:</p>
  115. <pre><code>
  116. $ java --module-path &lt;pathto&gt;/aspectjrt.jar:demo.jar --module demo/pkg.Demo
  117. Azpect running
  118. Demo running
  119. </code></pre>
  120. <p>That's it!</p>
  121. <br><br>
  122. <h4>Binary weaving with modules</h4>
  123. <p>A module is really just a jar with a module-info descriptor. As such you can simply pass a module on the <tt>inpath</tt>
  124. and binary weave it with other aspects. Take the module we built above, let's weave into it again:</p>
  125. <pre><code>extra/AnotherAzpect.java
  126. package extra;
  127. public aspect AnotherAzpect {
  128. before(): execution(* *(..)) && !within(*Azpect) {
  129. System.out.println("AnotherAzpect running");
  130. }
  131. }
  132. </code></pre>
  133. <pre><code>
  134. $ ajc -inpath demo.jar AnotherAzpect.java -outjar newdemo.jar</code></pre>
  135. <p>Notice how there was no complaint here that the <tt>org.aspectj.runtime</tt> module hadn't been passed in. That is because <tt>inpath</tt>
  136. was being used which doesn't treat specified jars as modules (and so does not check dependencies). There is no <tt>module-inpath</tt> right now.
  137. <p>Because the new jar produced includes the compiled aspect, the module-info specification inside is still correct, so we can run it
  138. exactly as before:</p>
  139. <pre><code>$ java --module-path ~/installs/aspectj190rc1/lib/aspectjrt.jar:newdemo.jar --module demo/pkg.Demo
  140. Azpect running
  141. AnotherAzpect running
  142. Demo running
  143. </code></pre>
  144. <br><br>
  145. <h4>Faster Spring AOP</h4>
  146. <p>Dave Syer recently created a series of benchmarks for checking the speed of Spring-AspectJ:
  147. <tt><a href="https://github.com/dsyer/spring-boot-aspectj">https://github.com/dsyer/spring-boot-aspectj</a></tt>
  148. <p>Here we can see the numbers for AspectJ 1.8.11 (on an older Macbook Pro):
  149. <pre><code>
  150. Benchmark (scale) Mode Cnt Score Error Units
  151. StartupBenchmark.ltw N/A avgt 10 2.553 ~ 0.030 s/op
  152. StartupBenchmark.ltw_100 N/A avgt 10 2.608 ~ 0.046 s/op
  153. StartupBenchmark.spring v0_10 avgt 10 2.120 ~ 0.148 s/op
  154. StartupBenchmark.spring v1_10 avgt 10 2.219 ~ 0.066 s/op
  155. StartupBenchmark.spring v1_100 avgt 10 2.244 ~ 0.030 s/op
  156. StartupBenchmark.spring v10_50 avgt 10 2.950 ~ 0.026 s/op
  157. StartupBenchmark.spring v20_50 avgt 10 3.854 ~ 0.090 s/op
  158. StartupBenchmark.spring v20_100 avgt 10 4.003 ~ 0.038 s/op
  159. StartupBenchmark.spring a0_10 avgt 10 2.067 ~ 0.019 s/op
  160. StartupBenchmark.spring a1_10 avgt 10 2.724 ~ 0.023 s/op
  161. StartupBenchmark.spring a1_100 avgt 10 2.778 ~ 0.057 s/op
  162. StartupBenchmark.spring a10_50 avgt 10 7.191 ~ 0.134 s/op
  163. StartupBenchmark.spring a10_100 avgt 10 7.191 ~ 0.168 s/op
  164. StartupBenchmark.spring a20_50 avgt 10 11.541 ~ 0.158 s/op
  165. StartupBenchmark.spring a20_100 avgt 10 11.464 ~ 0.157 s/op
  166. </code></pre>
  167. <p>So this is the average startup of an app affected by aspects applying to the beans involved.
  168. Where numbers are referenced the first is the number of aspects/pointcuts and the second
  169. is the number of beans. The 'a' indicates an annotation based pointcut vs a non-annotation
  170. based pointcut ('v'). Notice things are much worse for annotation based pointcuts. At 20
  171. pointcuts and 50 beans the app is 9 seconds slower to startup.
  172. <br>
  173. <p>In AspectJ 1.8.12 and 1.9.0.RC1 some work has been done here. The key change is to recognize that the use
  174. of annotations with runtime retention is much more likely than annotations with class level
  175. retention. Retrieving annotations with class retention is costly because we must open the
  176. bytes for the class file and dig around in there (vs runtime retention which are immediately
  177. accessible by reflection on the types). In 1.8.11 the actual type of the annotation involved
  178. in the matching is ignored and the code will fetch *all* the annotations on the type/method/field
  179. being matched against. So even if the match is looking for a runtime retention annotation, we
  180. were doing the costly thing of fetching any class retention annotations. In 1.8.12/1.9.0.RC1
  181. we take the type of the match annotation into account - allowing us to skip opening the classfiles
  182. in many cases. There is also some deeper work on activating caches that were not previously
  183. being used correctly but the primary change is factoring in the annotation type.
  184. <p>What difference does that make?
  185. AspectJ 1.9.0.RC1:
  186. <pre><code>
  187. Benchmark (scale) Mode Cnt Score Error Units
  188. StartupBenchmark.ltw N/A avgt 10 2.568 ~ 0.035 s/op
  189. StartupBenchmark.ltw_100 N/A avgt 10 2.622 ~ 0.075 s/op
  190. StartupBenchmark.spring v0_10 avgt 10 2.096 ~ 0.054 s/op
  191. StartupBenchmark.spring v1_10 avgt 10 2.206 ~ 0.031 s/op
  192. StartupBenchmark.spring v1_100 avgt 10 2.252 ~ 0.025 s/op
  193. StartupBenchmark.spring v10_50 avgt 10 2.979 ~ 0.071 s/op
  194. StartupBenchmark.spring v20_50 avgt 10 3.851 ~ 0.058 s/op
  195. StartupBenchmark.spring v20_100 avgt 10 4.000 ~ 0.046 s/op
  196. StartupBenchmark.spring a0_10 avgt 10 2.071 ~ 0.026 s/op
  197. StartupBenchmark.spring a1_10 avgt 10 2.182 ~ 0.032 s/op
  198. StartupBenchmark.spring a1_100 avgt 10 2.272 ~ 0.024 s/op
  199. StartupBenchmark.spring a10_50 avgt 10 2.557 ~ 0.027 s/op
  200. StartupBenchmark.spring a10_100 avgt 10 2.598 ~ 0.040 s/op
  201. StartupBenchmark.spring a20_50 avgt 10 2.961 ~ 0.043 s/op
  202. StartupBenchmark.spring a20_100 avgt 10 3.093 ~ 0.098 s/op
  203. </code></pre>
  204. <p>Look at the a20_100 case - instead of impacting start time by 9 seconds, it impacts it by 1 second.
  205. <h3>More to come...</h3>
  206. <ul>
  207. <li><p>Eclipse JDT Java 9 support is still being actively worked on and lots of fixes will be coming through over the next few months
  208. and included in AspectJ 1.9.X revisions.</p>
  209. <li><p>AspectJ does not currently modify <tt>module-info.java</tt> files. An aspect from one module applying to code in
  210. another module clearly introduces a dependency between those two modules. There is no reason - other than time! - that
  211. this can't be done. (<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=526244">Issue 526244</a>)</p>
  212. <li><p>Related to that AspectJ, on detection of aspects should be able to automatically introduce the <tt>requires org.aspectj.runtime</tt> to
  213. the <tt>module-info</tt>. (<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=526242">Issue 526242</a>)</p>
  214. <li><p>Module aware variants of AspectJ paths: <tt>--module-inpath</tt>, <tt>--module-aspectpath</tt>. (<a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=526243">Issue 526243</a>)</p>
  215. </ul>
  216. <!-- ============================== -->
  217. </body>
  218. </html>