This example (calculator-annotation) implements the similar annotation mechanism of Spring Data JPA Repositories.
That is, a classpath-scanner searches for specific interfaces and creates a proxy for all found interfaces.
Every method should need two integer parameter and integer return type. This proxy can then be @Autowired into your classes.
For enabling this annotation, you simply need to add the following annotation to your configuration class:
@Configuration
@EnableCalculatorProcessor({"my.package"})
public class MyApplication {
...
} This will now scan "my.package" and all subpackages for interfaces that implement com.example.calculator.processor.CalculatorProcessor and create implementations for them.
package my.package.service;
import com.example.calculator.processor.CalculatorProcessor;
import ...
public interface CalculatorService extends CalculatorProcessor {
@Calculate(method = ADD)
int addNumbers(int firstNumber, int secondNumber);
@Calculate(method = SUB)
int subtractNumbers(int firstNumber, int secondNumber);
@Calculate(method = DIV)
int divideNumbers(int firstNumber, int secondNumber);
@Calculate(method = MUL)
int multiplyNumbers(int firstNumber, int secondNumber);
}A java.lang.reflect.Proxy will be created for the
found interface. Every method will be transformed into a calculate-processor-definition and will be compiled on startup.
- Only two integer parameters are supported
- Only integer return type is supported
@Calculcateannotation supports only four methods:ADD(Addition),SUB(Subtraction),DIV(Division),MUL(Multiplication).
CalculatorApplication.java
Add @EnableCalculatorProcessor for enabling the Calculator Annotation
@SpringBootApplication
@EnableCalculatorProcessor("com.example.services")
public class CalculatorApplication {
public static void main(String[] args) {
SpringApplication.run(CalculatorApplication.class, args);
}
}CalculatorService.java
Create an interface which extends CalculatorProcessor and add @Calculate to the an abstract method
public interface CalculatorService extends CalculatorProcessor {
@Calculate(method = ADD)
int addNumbers(int firstNumber, int secondNumber);
}CalculatorController.java
Inject or Autowire the CalculatorService and call addNumbers directly passing the values
public class CalculatorController {
@Autowired
private CalculatorService calculatorService;
@GetMapping("/add")
public int addNumbers(int firstNumber, int secondNumber) {
return calculatorService.addNumbers(firstNumber, secondNumber);
}
}See LICENSE file.