{"id":1796,"date":"2012-09-19T11:48:00","date_gmt":"2012-09-19T11:48:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/spring-adding-aop-support.html"},"modified":"2012-10-22T06:48:26","modified_gmt":"2012-10-22T06:48:26","slug":"spring-adding-aop-support","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html","title":{"rendered":"Spring &#8211; Adding AOP support"},"content":{"rendered":"<div dir=\"ltr\" style=\"text-align: left\">I heard a story about one senior (and quite highly paid) softwaree engineer. He was given task to log every method in every controller in project he was working on. Engineer rewrote all controller methods, so from code like this:<\/p>\n<pre class=\"brush:java\">    @RequestMapping(method = RequestMethod.GET)\r\n    public String showEmployees(Model model) {\r\n        List&lt;Employee&gt; employees = employeeDao.list();\r\n        model.addAttribute('employees', employees);\r\n\r\n        return 'employees\/list';\r\n    }<\/pre>\n<p>he made following code:<\/p>\n<pre class=\"brush:java\">    @RequestMapping(method = RequestMethod.GET)\r\n    public String showEmployees(Model model) {\r\n LOGGER.log('Invoking method showEmployees');\r\n\r\n        List&lt;Employee&gt; employees = employeeDao.list();\r\n        model.addAttribute('employees', employees);\r\n\r\n LOGGER.log('Returning from method showEmployees');\r\n        return 'employees\/list';\r\n    }<\/pre>\n<p>What\u2019s wrong with this code? Well:          <\/p>\n<li>It takes lot of time to alter every method with such code<\/li>\n<li>It is error prone \u2013 you can introduce typos or forget to add logging somewhere<\/li>\n<li>It is <strong>mixing cross-cutting concerns<\/strong>. That means you are adding same kind of repetetive, boilerplate and unrelated code to places where it doesn\u2019t belong.<\/li>\n<p>For example, what is the responsibility of showEmployees method? It is invoking service, getting employees and putting them to model. Logging really isn\u2019t it\u2019s responsibility, so why to mix those concerns?          <\/p>\n<p>If engineer I mentioned knew about <strong>Aspect Oriented Programming<\/strong> he would save lot of time and made code better and more readable. Spring supports something called \u201cAspects\u201d that are made exactly for such a problems. Aspects allow us to define common functionality in one place. Before we write any code, there is some terminology to understand. This terminology is quite huge and I am not going to write it here, but I encourage you to read <a href=\"http:\/\/static.springsource.org\/spring\/docs\/3.1.x\/spring-framework-reference\/html\/aop.html\">Spring\u2019s official reference page on AOP<\/a> if you wish to know more. You should at least understand what is Advice, Join Point, Pointcut, Aspect and Weaving.          <div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>OK let\u2019s add Aspect for logging controller methods, exactly what should\u2019ve done engineer from the story in the beginning.           <\/p>\n<p>We must first add dependencies to <strong>pom.xml<\/strong> on AspectJ library:<\/p>\n<pre class=\"brush:xml\">        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.aspectj&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;aspectjrt&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.6.11&lt;\/version&gt;\r\n        &lt;\/dependency&gt;\r\n        &lt;dependency&gt;\r\n            &lt;groupId&gt;org.aspectj&lt;\/groupId&gt;\r\n            &lt;artifactId&gt;aspectjtools&lt;\/artifactId&gt;\r\n            &lt;version&gt;1.6.11&lt;\/version&gt;\r\n        &lt;\/dependency&gt;<\/pre>\n<p>Also check if you have dependency on Spring\u2019s AOP (but if you follow this tutorial from the very beginning you already have it):<\/p>\n<pre class=\"brush:xml\">  &lt;dependency&gt;\r\n   &lt;groupId&gt;org.springframework&lt;\/groupId&gt;\r\n   &lt;artifactId&gt;spring-aop&lt;\/artifactId&gt;\r\n   &lt;version&gt;3.1.0.RELEASE&lt;\/version&gt;\r\n  &lt;\/dependency&gt;<\/pre>\n<p>Now let\u2019s write Aspect\u2019s code. Create package org.timesheet.<strong>aspects<\/strong> and add ControllerLoggingAspect class:<\/p>\n<pre class=\"brush:java\">package org.timesheet.aspects;\r\n\r\nimport org.aspectj.lang.JoinPoint;\r\nimport org.aspectj.lang.annotation.AfterReturning;\r\nimport org.aspectj.lang.annotation.Aspect;\r\nimport org.aspectj.lang.annotation.Before;\r\nimport org.aspectj.lang.annotation.Pointcut;\r\n\r\nimport java.util.Arrays;\r\n\r\n\/**\r\n * Will log every invokation of @RequestMapping annotated methods\r\n * in @Controller annotated beans.\r\n *\/\r\n@Aspect\r\npublic class ControllerLoggingAspect {\r\n\r\n    @Pointcut('within(@org.springframework.stereotype.Controller *)')\r\n    public void controller() {}\r\n\r\n    @Pointcut('execution(* *(..))')\r\n    public void methodPointcut() {}\r\n\r\n    @Pointcut('within(@org.springframework.web.bind.annotation.RequestMapping *)')\r\n    public void requestMapping() {}\r\n\r\n    @Before('controller() &amp;&amp; methodPointcut() &amp;&amp; requestMapping()')\r\n    public void aroundControllerMethod(JoinPoint joinPoint) throws Throwable {\r\n        System.out.println('Invoked: ' + niceName(joinPoint));\r\n    }\r\n\r\n    @AfterReturning('controller() &amp;&amp; methodPointcut() &amp;&amp; requestMapping()')\r\n    public void afterControllerMethod(JoinPoint joinPoint) {\r\n        System.out.println('Finished: ' + niceName(joinPoint));\r\n    }\r\n\r\n    private String niceName(JoinPoint joinPoint) {\r\n        return joinPoint.getTarget().getClass()\r\n                + '#' + joinPoint.getSignature().getName()\r\n                + '\\n\\targs:' + Arrays.toString(joinPoint.getArgs());\r\n    }\r\n\r\n}<\/pre>\n<p>This code says, that @Before and @AfterReturning from controller method we will log information about it\u2019s invokation (name and arguments). This advices execute when all three pointcuts are matching. <i>controller()<\/i> pointcut marks matching join point (that matches stereotype Controller) at which advice should be woven. <i>methodPointcut()<\/i> marks that we\u2019re dealing with method call and <i>requestMapping()<\/i> pointcut marks methods annotated with @RequestMapping.          <\/p>\n<p>To make it work, we\u2019ll add <strong>aop.xml<\/strong> Spring configuration file under src\/main\/resources:<\/p>\n<pre class=\"brush:xml\">&lt;?xml version='1.0' encoding='UTF-8'?&gt;\r\n&lt;beans xmlns='http:\/\/www.springframework.org\/schema\/beans'\r\n       xmlns:xsi='http:\/\/www.w3.org\/2001\/XMLSchema-instance' xmlns:aop='http:\/\/www.springframework.org\/schema\/aop'\r\n       xsi:schemaLocation='http:\/\/www.springframework.org\/schema\/beans http:\/\/www.springframework.org\/schema\/beans\/spring-beans.xsd http:\/\/www.springframework.org\/schema\/aop http:\/\/www.springframework.org\/schema\/aop\/spring-aop-2.0.xsd'&gt;\r\n\r\n    &lt;!-- AOP support --&gt;\r\n    &lt;bean id='controllerAspect' class='org.timesheet.aspects.ControllerLoggingAspect' \/&gt;\r\n    &lt;aop:aspectj-autoproxy&gt;\r\n        &lt;aop:include name='controllerAspect' \/&gt;\r\n    &lt;\/aop:aspectj-autoproxy&gt;\r\n\r\n&lt;\/beans&gt;<\/pre>\n<p>And then we\u2019ll import it in <strong>timesheet-servlet.xml<\/strong> Spring config:<\/p>\n<pre class=\"brush:xml\">&lt;import resource='classpath:aop.xml' \/&gt;<\/pre>\n<p>This was the last part of tutorial. I hope you have now better understanding of what Spring is and how does it help to solve your problems. Remember that we\u2019ve covered only tiny piece of Spring in this tutorial. There is still much more to explore! <\/p>\n<p><strong><i>Reference: <\/i><\/strong><a href=\"http:\/\/vrtoonjava.wordpress.com\/2012\/06\/17\/part-6-adding-aop-support\/\">Part 6 \u2013 Adding AOP support<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/p\/jcg.html\">JCG partner<\/a> Michal Vrtiak at the <a href=\"http:\/\/vrtoonjava.wordpress.com\/\">vrtoonjava<\/a> blog.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>I heard a story about one senior (and quite highly paid) softwaree engineer. He was given task to log every method in every controller in project he was working on. Engineer rewrote all controller methods, so from code like this: @RequestMapping(method = RequestMethod.GET) public String showEmployees(Model model) { List&lt;Employee&gt; employees = employeeDao.list(); model.addAttribute(&#8217;employees&#8217;, employees); return &hellip;<\/p>\n","protected":false},"author":242,"featured_media":88,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[252,74,73,30],"class_list":["post-1796","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-aop","tag-aspect-oriented-programming","tag-aspectj","tag-spring"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Spring - Adding AOP support - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"I heard a story about one senior (and quite highly paid) softwaree engineer. He was given task to log every method in every controller in project he was\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring - Adding AOP support - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"I heard a story about one senior (and quite highly paid) softwaree engineer. He was given task to log every method in every controller in project he was\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2012-09-19T11:48:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-22T06:48:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/aspectj-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Michal Vrtiak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Michal Vrtiak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-adding-aop-support.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-adding-aop-support.html\"},\"author\":{\"name\":\"Michal Vrtiak\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/813b2013cd445be1ca64dda08f9e4ca3\"},\"headline\":\"Spring &#8211; Adding AOP support\",\"datePublished\":\"2012-09-19T11:48:00+00:00\",\"dateModified\":\"2012-10-22T06:48:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-adding-aop-support.html\"},\"wordCount\":467,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-adding-aop-support.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/aspectj-logo.jpg\",\"keywords\":[\"AOP\",\"Aspect Oriented Programming\",\"AspectJ\",\"Spring\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-adding-aop-support.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-adding-aop-support.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-adding-aop-support.html\",\"name\":\"Spring - Adding AOP support - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-adding-aop-support.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-adding-aop-support.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/aspectj-logo.jpg\",\"datePublished\":\"2012-09-19T11:48:00+00:00\",\"dateModified\":\"2012-10-22T06:48:26+00:00\",\"description\":\"I heard a story about one senior (and quite highly paid) softwaree engineer. He was given task to log every method in every controller in project he was\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-adding-aop-support.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-adding-aop-support.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-adding-aop-support.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/aspectj-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/aspectj-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2012\\\/09\\\/spring-adding-aop-support.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Spring &#8211; Adding AOP support\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/813b2013cd445be1ca64dda08f9e4ca3\",\"name\":\"Michal Vrtiak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f4d83f560ec21c8217f719feca9a7f453ce155f1537b2cbc1d601cba9a4860b7?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f4d83f560ec21c8217f719feca9a7f453ce155f1537b2cbc1d601cba9a4860b7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f4d83f560ec21c8217f719feca9a7f453ce155f1537b2cbc1d601cba9a4860b7?s=96&d=mm&r=g\",\"caption\":\"Michal Vrtiak\"},\"description\":\"Michal is a freelancer currently located in Prague, Czech Republic with huge passion for Java platform. He is very enthusiastic about Dependency Injection, IntelliJ IDEA and loves to use both Spring and Java EE.\",\"sameAs\":[\"http:\\\/\\\/vrtoonjava.wordpress.com\\\/\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/Michal-Vrtiak\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spring - Adding AOP support - Java Code Geeks","description":"I heard a story about one senior (and quite highly paid) softwaree engineer. He was given task to log every method in every controller in project he was","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html","og_locale":"en_US","og_type":"article","og_title":"Spring - Adding AOP support - Java Code Geeks","og_description":"I heard a story about one senior (and quite highly paid) softwaree engineer. He was given task to log every method in every controller in project he was","og_url":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2012-09-19T11:48:00+00:00","article_modified_time":"2012-10-22T06:48:26+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/aspectj-logo.jpg","type":"image\/jpeg"}],"author":"Michal Vrtiak","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Michal Vrtiak","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html"},"author":{"name":"Michal Vrtiak","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/813b2013cd445be1ca64dda08f9e4ca3"},"headline":"Spring &#8211; Adding AOP support","datePublished":"2012-09-19T11:48:00+00:00","dateModified":"2012-10-22T06:48:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html"},"wordCount":467,"commentCount":2,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/aspectj-logo.jpg","keywords":["AOP","Aspect Oriented Programming","AspectJ","Spring"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html","url":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html","name":"Spring - Adding AOP support - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/aspectj-logo.jpg","datePublished":"2012-09-19T11:48:00+00:00","dateModified":"2012-10-22T06:48:26+00:00","description":"I heard a story about one senior (and quite highly paid) softwaree engineer. He was given task to log every method in every controller in project he was","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/aspectj-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/aspectj-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2012\/09\/spring-adding-aop-support.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Spring &#8211; Adding AOP support"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/813b2013cd445be1ca64dda08f9e4ca3","name":"Michal Vrtiak","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f4d83f560ec21c8217f719feca9a7f453ce155f1537b2cbc1d601cba9a4860b7?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f4d83f560ec21c8217f719feca9a7f453ce155f1537b2cbc1d601cba9a4860b7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f4d83f560ec21c8217f719feca9a7f453ce155f1537b2cbc1d601cba9a4860b7?s=96&d=mm&r=g","caption":"Michal Vrtiak"},"description":"Michal is a freelancer currently located in Prague, Czech Republic with huge passion for Java platform. He is very enthusiastic about Dependency Injection, IntelliJ IDEA and loves to use both Spring and Java EE.","sameAs":["http:\/\/vrtoonjava.wordpress.com\/"],"url":"https:\/\/www.javacodegeeks.com\/author\/Michal-Vrtiak"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1796","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/242"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=1796"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/1796\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/88"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=1796"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=1796"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=1796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}