Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Using AspectJ Aspect with CDI and dependency injection

Hi Eric,

I usually do not disable Maven Compiler, I just configure it and AspectJ Maven in a way so as not to interfere with each other. Let me know if you are interested. But of course disabling Maven Compiler completely is a safe bet for that kind of problem, too.

As for your JEE/CDI problem: I am not a framework guy, I neither use Spring nor JEE, mostly because programming is not my job (used to be 20 years ago) and I just do it for fun. So maybe I am not the most qualified person to answer that. But generally speaking, you already kinda nailed it: Aspect lifecycle is handled by AJ, not via CDI. And frankly, I even think it shouldn't. We have a bit of a hen and egg problem here, if you think about it. AOP is meant to implement cross-cutting concerns, i.e. AOP needs "to be there first", especially when thinking about AspectJ doing bytecode weaving during class-loading, which is what you essentially do with LTW. So the weaving agent needs to be up and running before any of the application classes are even loaded into the JVM. Spring AOP is a different kind of beast because it uses delegation via dynamic proxies, not bytecode weaving. Furthermore, a Spring aspect is also a Spring component and only works for other Spring components, i.e. there is a strong dependency on the surrounding framework.

Maybe there is a way to get CDI working for aspects, but if there is, then only in some kind of "lazy instantiation" scenario, i.e. aspect weaving and class-loading is finished but DI into the aspect is only done later, e.g. when the aspect first accesses the injected object. To me this feels a little creepy though because suddenly the aspect would depend on the application and you could run into issues with aspects that ought to be kicking in early, such as logging or tracing. For aspects which are designed to only be used after the application is already wired up, you might have a chance. Someone else might be able to help you there. Does it work for you if you ask some kind of factory to provide you with a dependency? I know, it is not DI and more difficult to test, but you can still provide setters for the aspect's dependencies and then easily unit-test the aspect, injecting mocks.

Regards
-- 
Alexander Kriegisch
https://scrum-master.de

Eric B schrieb am 13.07.2018 10:32:
> 
> Hi Alex,
> 
> 
> Thanks for pointing that out. I can't believe I missed it. I had
> intentionally tried to disable the maven compiler using
> -Dmaven.main.skip=true, but I must have forgotten to use it for this
> attempt.
> 
> 
> I'm still perturbed as to how to get CDI to inject an AJ aspect though. I
> cannot seem to find the magic solution (if one exists) to configure the
> project such that I can get injections into my Aspect bean. I'm using LTW
> and realize that the lifecycle of the aspect is done via AJ and not
> through CDI. Nonetheless, in Spring, there is always the
> SpringBeanAutowiringSupport utility that you can use to wire an existing
> bean. Do you know if there is anything equivalent in JEE to accomplish DI
> in an Aspect?
> 
> 
> Thanks,
> 
> Eric
> 
> 
> On Thu, Jul 12, 2018 at 9:38 PM Alexander Kriegisch
> <alexander@xxxxxxxxxxxxxx <mailto:alexander@xxxxxxxxxxxxxx>
> > wrote:
>> Hi Eric.
>> 
>> The error comes from Maven Compiler, not from AspectJ Maven, i.e. Javac
>> tries to compile something you probably want to be compiled by Ajc.
>> Without seeing your POM I cannot say more, but the configuration with
>> regard to those two plugins is probably the root cause of your problem.
>> 
>> Regards
>> --
>> Alexander Kriegisch
>> https://scrum-master.de
>> 
>> 
>> Eric B schrieb am 12.07.2018 23:22:
>> >
>> > I'm trying to figure out a way to inject dependencies into an Aspect
>> that
>> > is running under Wildfly 10 with CDI.
>> >
>> >
>> > From what I can tell, by definition, I need to have a no-argument
>> > constructor in the Aspect, which already implies AJ cannot support the
>> > constructor injection pattern. Please correct me if I am mistaken.
>> >
>> >
>> > Secondly, once I have fields annotated with @Inject, I'm not sure how
>> to
>> > tell CDI to inject beans into my aspect. If I remember correctly, in
>> > Spring, I can use the .aspectOf() as a factory-method to declare the
>> bean
>> > to Spring. This was accomplished using XML definitions.
>> >
>> >
>> > However, when I try to do something similar in CDI, using @Produces, it
>> > does not seem to be work; the compiler throws errors that the
>> .aspectOf()
>> > method in my aspect does not exist.
>> >
>> >
>> > > public classUserAccountAspectFactory {
>> >
>> > @Produces
>> > publicUserAccountStatusAspect
>> > injectUserAccountStatusAspectDependencies()throwsNoSuchMethodException,
>> > InvocationTargetException, IllegalAccessException {
>> > returnUserAccountStatusAspect.aspectOf();
>> > }
>> > }
>> >
>> >
>> >
>> >
>> >> [ERROR] Failed to execute goal
>> >> org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
>> >> (default-compile) on project adams-aspects: Compilation failure
>> >>
>> >>
>> >> [ERROR]
>> >>
>> /C:/dev/Projects/develop/aspects/src/main/java/model/interceptor/UserAccountAspectFactory.java:[11,39]
>> >> cannot find symbol
>> >>
>> >>
>> >> [ERROR] symbol: method aspectOf()
>> >>
>> >>
>> >> [ERROR] location: class model.interceptor.UserAccountStatusAspect
>> >>
>> >>
>> >> [ERROR]
>> >>
>> >>
>> >> [ERROR] -> [Help 1]
>> >>
>> >
>> > Which surprises me b/c when I look at the UserAccountStatusAspect.class
>> > file, I see that ajc has added the .aspectOf() method to the compiled
>> > class.
>> >
>> >
>> > I'm obviously doing something wrong, but not quite sure what.
>> >
>> >
>> > Can anyone point me in the right direction please?
>> >
>> >
>> > Thanks,
>> >
>> >
>> > Eric
>> >
>> >
>> 
>> _______________________________________________
>> aspectj-users mailing list
>> aspectj-users@xxxxxxxxxxx
>> <mailto:aspectj-users@xxxxxxxxxxx>
>> To change your delivery options, retrieve your password, or unsubscribe
>> from this list, visit
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>



Back to the top