Search code examples
mavenspring-bootspring-aopmulti-module

Spring Boot AOP in multi module project does not execute Before Advice


I'm doing my fist steps with Springs AOP and wanted to start with a simple logging advice. My project is a multi module maven project with the following structure:

parentProject
|__aop
|__data
|__web

The web module has a user service class in the package de.my.awsome.project.web.service with a saveNewUser Method:

@Service
public class UserService {
...
    public MdUser saveNewUser(UserModel user) {
        MdUser newUser = this.save(user);
        createGroupMembership(user, newUser);
        return newUser;
    }
}

The method works as expected so don't bother with details about that.

What I've done now is to create the following class in the aop module:

@Component
@Aspect
public class LoggingAspect {

    Logger logger = Logger.getLogger(getClass());

    @Before("execution(public * de.my.awsome.project.web.service.UserService.saveNewUser(..))")
    public void newUserLog(JoinPoint joinpoint) {
        logger.info(joinpoint.getSignature() + " with user " + joinpoint.getArgs()[0]);
}

}

I added a dependency for the web module in the pom of the aop module:

<dependency>
    <groupId>de.my.awsome.project</groupId>
    <artifactId>web</artifactId>
    <version>${project.version}</version>
</dependency>

I even wrote a ConfigurationClasse even though I thought this would not be necessary with SpringBoot:

@Configuration
@ComponentScan(basePackages="de.fraport.bvd.mobisl.aop")
public class AspectsConfig {

}

The expected result is a log-message like "saveNewUser with user xyz". But the logging method is never called. What have I missed to do?


Solution

  • Well, the answer that @sankar posted didn't work either but I found the solution by myself.

    I had to add a dependency to my aop module in the web modules pom, not vice versa. Then I added an Import of my AspectsConfig to the web modules SpringBootApplication class and it worked.

    @SpringBootApplication
    @Import(value= {JPAConfig.class, AspectsConfig.class})
    @EnableAspectJAutoProxy
    public class WebApplication {
    
    @Autowired
    private JPAConfig config;
    
    @Autowired
    private AspectsConfig aspectConfig;
    
        public static void main(String[] args) {
            SpringApplication.run(WebApplication.class, args);
        }
    }