diff --git a/aspectj/pom.xml b/aspectj/pom.xml
new file mode 100644
index 0000000000..2a1cff11c8
--- /dev/null
+++ b/aspectj/pom.xml
@@ -0,0 +1,131 @@
+
+ 4.0.0
+ com.baeldung
+ aspectj
+ 0.0.1-SNAPSHOT
+ aspectj
+
+
+
+ org.aspectj
+ aspectjrt
+ ${aspectj.version}
+
+
+
+ org.aspectj
+ aspectjweaver
+ ${aspectj.version}
+
+
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+
+ ch.qos.logback
+ logback-core
+ ${logback.version}
+
+
+
+
+ junit
+ junit
+ ${junit.version}
+
+
+
+
+
+ aspectj
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${source.version}
+ ${source.version}
+
+
+
+
+
+ org.codehaus.mojo
+ aspectj-maven-plugin
+ 1.7
+
+ ${source.version}
+ ${source.version}
+ ${source.version}
+ true
+ true
+ ignore
+ ${project.build.sourceEncoding}
+
+
+
+
+
+
+ compile
+ test-compile
+
+
+
+
+
+
+
+
+
+
+ 1.8
+ 1.6.11
+ UTF-8
+ 1.8.9
+ 1.7.21
+ 1.1.7
+ 3.5.1
+ 4.12
+
+
+
\ No newline at end of file
diff --git a/aspectj/src/main/java/com/baeldung/aspectj/Account.java b/aspectj/src/main/java/com/baeldung/aspectj/Account.java
new file mode 100644
index 0000000000..59cab72ebf
--- /dev/null
+++ b/aspectj/src/main/java/com/baeldung/aspectj/Account.java
@@ -0,0 +1,13 @@
+package com.baeldung.aspectj;
+
+public class Account {
+ int balance = 20;
+
+ public boolean withdraw(int amount) {
+ if (balance - amount > 0) {
+ balance = balance - amount;
+ return true;
+ } else
+ return false;
+ }
+}
diff --git a/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj
new file mode 100644
index 0000000000..3bdddd22a8
--- /dev/null
+++ b/aspectj/src/main/java/com/baeldung/aspectj/AccountAspect.aj
@@ -0,0 +1,30 @@
+package com.baeldung.aspectj;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public aspect AccountAspect {
+ private static final Logger logger = LoggerFactory.getLogger(AccountAspect.class);
+ final int MIN_BALANCE = 10;
+
+ pointcut callWithDraw(int amount, Account account):
+ call(boolean Account.withdraw(int)) && args(amount) && target(account);
+
+ before(int amount, Account account) : callWithDraw(amount, account) {
+ logger.info(" Balance before withdrawal: {}", account.balance);
+ logger.info(" Withdraw ammout: {}", amount);
+ }
+
+ boolean around(int amount, Account account) : callWithDraw(amount, account) {
+ if (account.balance - amount >= MIN_BALANCE)
+ return proceed(amount, account);
+ else {
+ logger.info("Withdrawal Rejected!");
+ return false;
+ }
+ }
+
+ after(int amount, Account balance) : callAtWithDraw(amount, balance) {
+ logger.info("Balance after withdrawal : {}", balance.balance);
+ }
+}
diff --git a/aspectj/src/main/java/com/baeldung/aspectj/Secured.java b/aspectj/src/main/java/com/baeldung/aspectj/Secured.java
new file mode 100644
index 0000000000..923f208c2f
--- /dev/null
+++ b/aspectj/src/main/java/com/baeldung/aspectj/Secured.java
@@ -0,0 +1,12 @@
+package com.baeldung.aspectj;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Secured {
+ public boolean isLocked() default false;
+}
diff --git a/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethod.java b/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethod.java
new file mode 100644
index 0000000000..aa4b733a00
--- /dev/null
+++ b/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethod.java
@@ -0,0 +1,23 @@
+package com.baeldung.aspectj;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SecuredMethod {
+ private static final Logger logger = LoggerFactory.getLogger(SecuredMethod.class);
+
+ @Secured(isLocked = true)
+ public void lockedMethod() throws Exception {
+ logger.info("lockedMethod");
+ }
+
+ @Secured(isLocked = false)
+ public void unlockedMethod() {
+ logger.info("unlockedMethod");
+ }
+
+ public static void main(String[] args) throws Exception {
+ SecuredMethod sv = new SecuredMethod();
+ sv.lockedMethod();
+ }
+}
\ No newline at end of file
diff --git a/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethodAspect.java b/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethodAspect.java
new file mode 100644
index 0000000000..9ea45ec43b
--- /dev/null
+++ b/aspectj/src/main/java/com/baeldung/aspectj/SecuredMethodAspect.java
@@ -0,0 +1,27 @@
+package com.baeldung.aspectj;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Aspect
+public class SecuredMethodAspect {
+ private static final Logger logger = LoggerFactory.getLogger(SecuredMethodAspect.class);
+
+ @Pointcut("@annotation(secured)")
+ public void callAt(Secured secured) {
+ }
+
+ @Around("callAt(secured)")
+ public Object around(ProceedingJoinPoint pjp, Secured secured) throws Throwable {
+ if (secured.isLocked()) {
+ logger.info(pjp.getSignature().toLongString() + " is locked");
+ return null;
+ } else {
+ return pjp.proceed();
+ }
+ }
+}
diff --git a/aspectj/src/main/resources/META-INF/aop.xml b/aspectj/src/main/resources/META-INF/aop.xml
new file mode 100644
index 0000000000..f930cde942
--- /dev/null
+++ b/aspectj/src/main/resources/META-INF/aop.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/aspectj/src/main/resources/logback.xml b/aspectj/src/main/resources/logback.xml
new file mode 100644
index 0000000000..8b566286b8
--- /dev/null
+++ b/aspectj/src/main/resources/logback.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %n
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/aspectj/src/test/java/com/baeldung/aspectj/test/AccountTest.java b/aspectj/src/test/java/com/baeldung/aspectj/test/AccountTest.java
new file mode 100644
index 0000000000..d90793f681
--- /dev/null
+++ b/aspectj/src/test/java/com/baeldung/aspectj/test/AccountTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.aspectj.test;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.aspectj.Account;
+
+public class AccountTest {
+ private Account account;
+
+ @Before
+ public void before() {
+ account = new Account();
+ }
+
+ @Test
+ public void givenBalance20AndMinBalance10_whenWithdraw5_thenSuccess() {
+ assertTrue(account.withdraw(5));
+ }
+
+ @Test
+ public void givenBalance20AndMinBalance10_whenWithdraw100_thenFail() {
+ assertFalse(account.withdraw(100));
+ }
+}
diff --git a/aspectj/src/test/java/com/baeldung/aspectj/test/SecuredMethodTest.java b/aspectj/src/test/java/com/baeldung/aspectj/test/SecuredMethodTest.java
new file mode 100644
index 0000000000..924bb279fd
--- /dev/null
+++ b/aspectj/src/test/java/com/baeldung/aspectj/test/SecuredMethodTest.java
@@ -0,0 +1,14 @@
+package com.baeldung.aspectj.test;
+
+import org.junit.Test;
+
+import com.baeldung.aspectj.SecuredMethod;
+
+public class SecuredMethodTest {
+ @Test
+ public void testMethod() throws Exception {
+ SecuredMethod service = new SecuredMethod();
+ service.unlockedMethod();
+ service.lockedMethod();
+ }
+}
\ No newline at end of file