AdviceFactory.java
package sprout.aop.advice;
import sprout.aop.advice.builder.AfterAdviceBuilder;
import sprout.aop.advice.builder.AroundAdviceBuilder;
import sprout.aop.advice.builder.BeforeAdviceBuilder;
import sprout.aop.advisor.Advisor;
import sprout.aop.advisor.PointcutFactory;
import sprout.beans.InfrastructureBean;
import sprout.beans.annotation.Component;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Optional;
import java.util.function.Supplier;
@Component
public class AdviceFactory implements InfrastructureBean {
private final Map<AdviceType, AdviceBuilder> builders;
private final PointcutFactory pointcutFactory;
public AdviceFactory(PointcutFactory pointcutFactory) {
this.pointcutFactory = pointcutFactory;
this.builders = Map.of(
AdviceType.AROUND, new AroundAdviceBuilder(),
AdviceType.BEFORE, new BeforeAdviceBuilder(),
AdviceType.AFTER, new AfterAdviceBuilder()
);
}
public Optional<Advisor> createAdvisor(Class<?> aspectCls,
Method m,
Supplier<Object> sup) {
return AdviceType.from(m)
.map(type -> builders.get(type)
.build(aspectCls, m, sup, pointcutFactory));
}
}