diff --git a/cdi/pom.xml b/cdi/pom.xml
new file mode 100644
index 0000000000..2a9d32188b
--- /dev/null
+++ b/cdi/pom.xml
@@ -0,0 +1,52 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ cdi
+ 1.0-SNAPSHOT
+
+ 4.3.1.RELEASE
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+ org.springframework
+ spring-core
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-test
+ ${spring.version}
+ test
+
+
+
+ org.aspectj
+ aspectjweaver
+ 1.8.9
+
+
+
+ org.jboss.weld.se
+ weld-se-core
+ 2.3.5.Final
+
+
+
\ No newline at end of file
diff --git a/cdi/src/main/java/com/baeldung/interceptor/Audited.java b/cdi/src/main/java/com/baeldung/interceptor/Audited.java
new file mode 100644
index 0000000000..4065450b09
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/interceptor/Audited.java
@@ -0,0 +1,12 @@
+package com.baeldung.interceptor;
+
+import javax.interceptor.InterceptorBinding;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@InterceptorBinding
+@Target( {ElementType.METHOD, ElementType.TYPE } )
+@Retention(RetentionPolicy.RUNTIME )
+public @interface Audited {}
diff --git a/cdi/src/main/java/com/baeldung/interceptor/AuditedInterceptor.java b/cdi/src/main/java/com/baeldung/interceptor/AuditedInterceptor.java
new file mode 100644
index 0000000000..46ab9b33c8
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/interceptor/AuditedInterceptor.java
@@ -0,0 +1,19 @@
+package com.baeldung.interceptor;
+
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.Interceptor;
+import javax.interceptor.InvocationContext;
+import java.lang.reflect.Method;
+
+@Audited @Interceptor
+public class AuditedInterceptor {
+ public static boolean calledBefore = false;
+ public static boolean calledAfter = false;
+ @AroundInvoke
+ public Object auditMethod(InvocationContext ctx) throws Exception {
+ calledBefore = true;
+ Object result = ctx.proceed();
+ calledAfter = true;
+ return result;
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/service/SuperService.java b/cdi/src/main/java/com/baeldung/service/SuperService.java
new file mode 100644
index 0000000000..e1e57a4e0d
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/service/SuperService.java
@@ -0,0 +1,10 @@
+package com.baeldung.service;
+
+import com.baeldung.interceptor.Audited;
+
+public class SuperService {
+ @Audited
+ public String deliverService(String uid) {
+ return uid;
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/spring/aspect/SpringTestAspect.java b/cdi/src/main/java/com/baeldung/spring/aspect/SpringTestAspect.java
new file mode 100644
index 0000000000..8c2ff2600b
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/spring/aspect/SpringTestAspect.java
@@ -0,0 +1,26 @@
+package com.baeldung.spring.aspect;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import javax.inject.Inject;
+import java.util.List;
+
+@Aspect
+public class SpringTestAspect {
+ @Autowired
+ private List accumulator;
+
+ @Around("execution(* com.baeldung.spring.service.SpringSuperService.*(..))")
+ public Object advice(ProceedingJoinPoint jp) throws Throwable {
+ String methodName = jp.getSignature().getName();
+ accumulator.add("Call to "+methodName);
+ Object obj = jp.proceed();
+ accumulator.add("Method called successfully: "+methodName);
+ return obj;
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/spring/configuration/AppConfig.java b/cdi/src/main/java/com/baeldung/spring/configuration/AppConfig.java
new file mode 100644
index 0000000000..6cfc8f8743
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/spring/configuration/AppConfig.java
@@ -0,0 +1,29 @@
+package com.baeldung.spring.configuration;
+
+import com.baeldung.spring.aspect.SpringTestAspect;
+import com.baeldung.spring.service.SpringSuperService;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+@EnableAspectJAutoProxy
+public class AppConfig {
+ @Bean
+ public SpringSuperService springSuperService() {
+ return new SpringSuperService();
+ }
+
+ @Bean
+ public SpringTestAspect springTestAspect(){
+ return new SpringTestAspect();
+ }
+
+ @Bean
+ public List getAccumulator(){
+ return new ArrayList();
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/spring/service/SpringSuperService.java b/cdi/src/main/java/com/baeldung/spring/service/SpringSuperService.java
new file mode 100644
index 0000000000..72dbd1c006
--- /dev/null
+++ b/cdi/src/main/java/com/baeldung/spring/service/SpringSuperService.java
@@ -0,0 +1,7 @@
+package com.baeldung.spring.service;
+
+public class SpringSuperService {
+ public String getInfoFromService(String code){
+ return code;
+ }
+}
diff --git a/cdi/src/main/resources/META-INF/beans.xml b/cdi/src/main/resources/META-INF/beans.xml
new file mode 100644
index 0000000000..d41b35e7d9
--- /dev/null
+++ b/cdi/src/main/resources/META-INF/beans.xml
@@ -0,0 +1,8 @@
+
+
+ com.baeldung.interceptor.AuditedInterceptor
+
+
\ No newline at end of file
diff --git a/cdi/src/test/java/com/baeldung/test/TestInterceptor.java b/cdi/src/test/java/com/baeldung/test/TestInterceptor.java
new file mode 100644
index 0000000000..d1b851c94f
--- /dev/null
+++ b/cdi/src/test/java/com/baeldung/test/TestInterceptor.java
@@ -0,0 +1,42 @@
+package com.baeldung.test;
+
+import com.baeldung.interceptor.Audited;
+import com.baeldung.interceptor.AuditedInterceptor;
+import com.baeldung.service.SuperService;
+import org.jboss.weld.environment.se.Weld;
+import org.jboss.weld.environment.se.WeldContainer;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.InterceptionType;
+import javax.enterprise.inject.spi.Interceptor;
+import javax.enterprise.util.AnnotationLiteral;
+
+import static javafx.beans.binding.Bindings.select;
+
+public class TestInterceptor {
+ Weld weld;
+ WeldContainer container;
+ @Before
+ public void init(){
+ weld = new Weld();
+ container = weld.initialize();
+ }
+
+ @After
+ public void shutdown(){
+ weld.shutdown();
+ }
+
+ @Test
+ public void givenTheService_whenMethodAndInterceptorExecuted_thenOK() {
+ SuperService superService = container.select(SuperService.class).get();
+ String code = "123456";
+ superService.deliverService(code);
+ Assert.assertTrue(AuditedInterceptor.calledBefore);
+ Assert.assertTrue(AuditedInterceptor.calledAfter);
+ }
+}
diff --git a/cdi/src/test/java/com/baeldung/test/TestSpringInterceptor.java b/cdi/src/test/java/com/baeldung/test/TestSpringInterceptor.java
new file mode 100644
index 0000000000..b5aedd4b76
--- /dev/null
+++ b/cdi/src/test/java/com/baeldung/test/TestSpringInterceptor.java
@@ -0,0 +1,38 @@
+package com.baeldung.test;
+
+import com.baeldung.spring.configuration.AppConfig;
+import com.baeldung.spring.service.SpringSuperService;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestExecutionListeners;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
+import org.springframework.test.context.support.DirtiesContextTestExecutionListener;
+import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
+
+import javax.inject.Inject;
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = {AppConfig.class})
+public class TestSpringInterceptor {
+ @Autowired
+ SpringSuperService springSuperService;
+
+ @Autowired
+ private List accumulator;
+
+ @Test
+ public void givenService_whenServiceAndAspectExecuted_thenOk(){
+ String code = "123456";
+ String result = springSuperService.getInfoFromService(code);
+ Assert.assertThat(accumulator.size(), is(2));
+ Assert.assertThat(accumulator.get(0),is("Call to getInfoFromService"));
+ Assert.assertThat(accumulator.get(1),is("Method called successfully: getInfoFromService"));
+ }
+}