Merge pull request #8125 from eugenp/revert-8119-BAEL-3275-2

Revert "BAEL-3275: Using blocking queue for pub-sub"
This commit is contained in:
Eric Martin
2019-10-31 20:43:47 -05:00
committed by GitHub
parent db85c8f275
commit 3225470df5
20543 changed files with 1642750 additions and 0 deletions
@@ -0,0 +1,29 @@
package com.baeldung.circulardependency;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class CircularDependencyA implements ApplicationContextAware, InitializingBean {
private CircularDependencyB circB;
private ApplicationContext context;
public CircularDependencyB getCircB() {
return circB;
}
@Override
public void afterPropertiesSet() throws Exception {
circB = context.getBean(CircularDependencyB.class);
}
@Override
public void setApplicationContext(final ApplicationContext ctx) throws BeansException {
context = ctx;
}
}
@@ -0,0 +1,22 @@
package com.baeldung.circulardependency;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CircularDependencyB {
private CircularDependencyA circA;
private String message = "Hi!";
@Autowired
public void setCircA(final CircularDependencyA circA) {
this.circA = circA;
}
public String getMessage() {
return message;
}
}
@@ -0,0 +1,23 @@
package com.baeldung.constructordi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.baeldung.constructordi.domain.Engine;
import com.baeldung.constructordi.domain.Transmission;
@Configuration
@ComponentScan("com.baeldung.constructordi")
public class Config {
@Bean
public Engine engine() {
return new Engine("v8", 5);
}
@Bean
public Transmission transmission() {
return new Transmission("sliding");
}
}
@@ -0,0 +1,31 @@
package com.baeldung.constructordi;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.baeldung.constructordi.domain.Car;
public class SpringRunner {
public static void main(String[] args) {
Car toyota = getCarFromXml();
System.out.println(toyota);
toyota = getCarFromJavaConfig();
System.out.println(toyota);
}
private static Car getCarFromJavaConfig() {
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
return context.getBean(Car.class);
}
private static Car getCarFromXml() {
ApplicationContext context = new ClassPathXmlApplicationContext("constructordi.xml");
return context.getBean(Car.class);
}
}
@@ -0,0 +1,21 @@
package com.baeldung.constructordi.domain;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Car {
private Engine engine;
private Transmission transmission;
@Autowired
public Car(Engine engine, Transmission transmission) {
this.engine = engine;
this.transmission = transmission;
}
@Override
public String toString() {
return String.format("Engine: %s Transmission: %s", engine, transmission);
}
}
@@ -0,0 +1,16 @@
package com.baeldung.constructordi.domain;
public class Engine {
private String type;
private int volume;
public Engine(String type, int volume) {
this.type = type;
this.volume = volume;
}
@Override
public String toString() {
return String.format("%s %d", type, volume);
}
}
@@ -0,0 +1,14 @@
package com.baeldung.constructordi.domain;
public class Transmission {
private String type;
public Transmission(String type) {
this.type = type;
}
@Override
public String toString() {
return String.format("%s", type);
}
}
@@ -0,0 +1,13 @@
package com.baeldung.dependency;
import org.springframework.stereotype.Component;
@Component
public class AnotherArbitraryDependency extends ArbitraryDependency {
private final String label = "Another Arbitrary Dependency";
public String toString() {
return label;
}
}
@@ -0,0 +1,13 @@
package com.baeldung.dependency;
import org.springframework.stereotype.Component;
@Component(value = "autowiredFieldDependency")
public class ArbitraryDependency {
private final String label = "Arbitrary Dependency";
public String toString() {
return label;
}
}
@@ -0,0 +1,13 @@
package com.baeldung.dependency;
import org.springframework.stereotype.Component;
@Component
public class YetAnotherArbitraryDependency extends ArbitraryDependency {
private final String label = "Yet Another Arbitrary Dependency";
public String toString() {
return label;
}
}
@@ -0,0 +1,14 @@
package com.baeldung.dependency.exception.app;
import com.baeldung.dependency.exception.repository.InventoryRepository;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service
public class PurchaseDeptService {
private InventoryRepository repository;
public PurchaseDeptService(@Qualifier("dresses") InventoryRepository repository) {
this.repository = repository;
}
}
@@ -0,0 +1,13 @@
package com.baeldung.dependency.exception.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages = "com.baeldung.dependency.exception")
public class SpringDependenciesExampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringDependenciesExampleApplication.class, args);
}
}
@@ -0,0 +1,10 @@
package com.baeldung.dependency.exception.repository;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;
@Qualifier("dresses")
@Repository
public class DressRepository implements InventoryRepository {
}
@@ -0,0 +1,7 @@
package com.baeldung.dependency.exception.repository;
import org.springframework.stereotype.Repository;
@Repository
public interface InventoryRepository {
}
@@ -0,0 +1,9 @@
package com.baeldung.dependency.exception.repository;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
@Qualifier("shoes")
@Repository
public class ShoeRepository implements InventoryRepository {
}
@@ -0,0 +1,16 @@
package com.baeldung.dependencyinjectiontypes;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ArticleFormatter {
@SuppressWarnings("resource")
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("dependencyinjectiontypes-context.xml");
ArticleWithSetterInjection article = (ArticleWithSetterInjection) context.getBean("articleWithSetterInjectionBean");
String formattedArticle = article.format("This is a text !");
System.out.print(formattedArticle);
}
}
@@ -0,0 +1,17 @@
package com.baeldung.dependencyinjectiontypes;
import org.springframework.beans.factory.annotation.Autowired;
public class ArticleWithConstructorInjection {
private TextFormatter formatter;
@Autowired
public ArticleWithConstructorInjection(TextFormatter formatter) {
this.formatter = formatter;
}
public String format(String text) {
return formatter.format(text);
}
}
@@ -0,0 +1,21 @@
package com.baeldung.dependencyinjectiontypes;
import org.springframework.beans.factory.annotation.Autowired;
public class ArticleWithSetterInjection {
private TextFormatter formatter;
public ArticleWithSetterInjection(TextFormatter formatter) {
this.formatter = formatter;
}
@Autowired
public void setTextFormatter(TextFormatter formatter) {
this.formatter = formatter;
}
public String format(String text) {
return formatter.format(text);
}
}
@@ -0,0 +1,8 @@
package com.baeldung.dependencyinjectiontypes;
public class TextFormatter {
public String format(String text) {
return text.toUpperCase();
}
}
@@ -0,0 +1,15 @@
package com.baeldung.dependencyinjectiontypes.annotation;
import org.springframework.beans.factory.annotation.Qualifier;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD, ElementType.METHOD,
ElementType.TYPE, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface CarQualifier {
}
@@ -0,0 +1,39 @@
package com.baeldung.dependencyinjectiontypes.app;
import com.baeldung.dependencyinjectiontypes.annotation.CarQualifier;
import com.baeldung.dependencyinjectiontypes.model.Car;
import com.baeldung.dependencyinjectiontypes.model.CarHandler;
import com.baeldung.dependencyinjectiontypes.model.Motorcycle;
import com.baeldung.dependencyinjectiontypes.model.Vehicle;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan("com.baeldung.dependencyinjectiontypes.model")
public class CustomConfiguration {
@Bean
@CarQualifier
public Car getMercedes() {
return new Car("E280", "Mercedes", "Diesel");
}
public static void main(String[] args) throws NoSuchFieldException {
ConfigurableApplicationContext context = SpringApplication.run(CustomConfiguration.class, args);
CarHandler carHandler = context.getBean(CarHandler.class);
carHandler.getVehicles().forEach(System.out::println);
}
@Bean
@CarQualifier
public Car getBmw() {
return new Car("M5", "BMW", "Petrol");
}
@Bean
public Motorcycle getSuzuki() {
return new Motorcycle("Yamaguchi", "Suzuki", true);
}
}
@@ -0,0 +1,25 @@
package com.baeldung.dependencyinjectiontypes.model;
public class Car extends Vehicle {
private String engineType;
public Car(String name, String manufacturer, String engineType) {
super(name, manufacturer);
this.engineType = engineType;
}
public String getEngineType() {
return engineType;
}
public void setEngineType(String engineType) {
this.engineType = engineType;
}
@Override
public String toString() {
return "Car{" +
"engineType='" + engineType + '\'' +
'}';
}
}
@@ -0,0 +1,26 @@
package com.baeldung.dependencyinjectiontypes.model;
import com.baeldung.dependencyinjectiontypes.annotation.CarQualifier;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ResolvableType;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class CarHandler {
@Autowired
@CarQualifier
private List<Vehicle> vehicles;
public List<Vehicle> getVehicles() throws NoSuchFieldException {
ResolvableType vehiclesType = ResolvableType.forField(getClass().getDeclaredField("vehicles"));
System.out.println(vehiclesType);
ResolvableType type = vehiclesType.getGeneric();
System.out.println(type);
Class<?> aClass = type.resolve();
System.out.println(aClass);
return this.vehicles;
}
}
@@ -0,0 +1,25 @@
package com.baeldung.dependencyinjectiontypes.model;
public class Motorcycle extends Vehicle {
private boolean twoWheeler;
public Motorcycle(String name, String manufacturer, boolean twoWheeler) {
super(name, manufacturer);
this.twoWheeler = true;
}
public boolean isTwoWheeler() {
return twoWheeler;
}
public void setTwoWheeler(boolean twoWheeler) {
this.twoWheeler = twoWheeler;
}
@Override
public String toString() {
return "Motorcycle{" +
"twoWheeler=" + twoWheeler +
'}';
}
}
@@ -0,0 +1,28 @@
package com.baeldung.dependencyinjectiontypes.model;
public abstract class Vehicle {
private String name;
private String manufacturer;
public Vehicle(String name, String manufacturer) {
this.name = name;
this.manufacturer = manufacturer;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
}
@@ -0,0 +1,14 @@
package com.baeldung.dependson;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.baeldung.dependson.config.Config;
import com.baeldung.dependson.file.processor.FileProcessor;
public class DriverApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
ctx.getBean(FileProcessor.class);
ctx.close();
}
}
@@ -0,0 +1,38 @@
package com.baeldung.dependson.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Lazy;
import com.baeldung.dependson.file.processor.FileProcessor;
import com.baeldung.dependson.file.reader.FileReader;
import com.baeldung.dependson.file.writer.FileWriter;
import com.baeldung.dependson.shared.File;
@Configuration
@ComponentScan("com.baeldung.dependson")
public class Config {
@Autowired
File file;
@Bean("fileProcessor")
@DependsOn({"fileReader","fileWriter"})
@Lazy
public FileProcessor fileProcessor(){
return new FileProcessor(file);
}
@Bean("fileReader")
public FileReader fileReader(){
return new FileReader(file);
}
@Bean("fileWriter")
public FileWriter fileWriter(){
return new FileWriter(file);
}
}
@@ -0,0 +1,19 @@
package com.baeldung.dependson.file.processor;
import org.springframework.beans.factory.annotation.Autowired;
import com.baeldung.dependson.file.reader.FileReader;
import com.baeldung.dependson.file.writer.FileWriter;
import com.baeldung.dependson.shared.File;
public class FileProcessor {
File file;
public FileProcessor(File file){
this.file = file;
if(file.getText().contains("write") && file.getText().contains("read")){
file.setText("processed");
}
}
}
@@ -0,0 +1,12 @@
package com.baeldung.dependson.file.reader;
import com.baeldung.dependson.shared.File;
public class FileReader {
public FileReader(File file) {
file.setText("read");
}
public void readFile() {}
}
@@ -0,0 +1,13 @@
package com.baeldung.dependson.file.writer;
import com.baeldung.dependson.shared.File;
public class FileWriter {
public FileWriter(File file){
file.setText("write");
}
public void writeFile(){}
}
@@ -0,0 +1,17 @@
package com.baeldung.dependson.shared;
import org.springframework.stereotype.Service;
@Service
public class File {
private String text = "";
public String getText() {
return text;
}
public void setText(String text) {
this.text = this.text+text;
}
}
@@ -0,0 +1,27 @@
package com.baeldung.di.spring;
import org.springframework.stereotype.Component;
@Component
public class Account {
private String accountNumber;
private String type;
public String getAccountNumber() {
return accountNumber;
}
public void setAccountNumber(String accountNumber) {
this.accountNumber = accountNumber;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
@@ -0,0 +1,5 @@
package com.baeldung.di.spring;
public interface AccountService {
}
@@ -0,0 +1,8 @@
package com.baeldung.di.spring;
import org.springframework.stereotype.Component;
@Component
public class AccountServiceImpl implements AccountService {
}
@@ -0,0 +1,5 @@
package com.baeldung.di.spring;
public interface AudioBookService {
}
@@ -0,0 +1,5 @@
package com.baeldung.di.spring;
public class AudioBookServiceImpl implements AudioBookService {
}
@@ -0,0 +1,5 @@
package com.baeldung.di.spring;
public interface AuthorService {
}
@@ -0,0 +1,5 @@
package com.baeldung.di.spring;
public class AuthorServiceImpl implements AuthorService {
}
@@ -0,0 +1,5 @@
package com.baeldung.di.spring;
public interface BookService {
}
@@ -0,0 +1,10 @@
package com.baeldung.di.spring;
import org.springframework.beans.factory.annotation.Autowired;
public class BookServiceImpl implements BookService {
@Autowired(required = false)
private AuthorService authorService;
}
@@ -0,0 +1,4 @@
package com.baeldung.di.spring;
public class Foo {
}
@@ -0,0 +1,6 @@
package com.baeldung.di.spring;
public class FooProcessor {
private Foo foo;
}
@@ -0,0 +1,5 @@
package com.baeldung.di.spring;
public interface IService {
public String serve();
}
@@ -0,0 +1,19 @@
package com.baeldung.di.spring;
public class IndexApp {
private IService service;
public String getServiceValue() {
return service.serve();
}
public IService getService() {
return service;
}
public void setService(IService service) {
this.service = service;
}
}
@@ -0,0 +1,10 @@
package com.baeldung.di.spring;
public class IndexService implements IService {
@Override
public String serve() {
return "Hello World";
}
}
@@ -0,0 +1,14 @@
package com.baeldung.di.spring;
public class InstanceServiceFactory {
public IService getService(int number) {
switch (number) {
case 1:
return new MessageService("Foo");
case 0:
return new IndexService();
default:
throw new IllegalArgumentException("Unknown parameter " + number);
}
}
}
@@ -0,0 +1,14 @@
package com.baeldung.di.spring;
public class MessageApp {
private IService iService;
public MessageApp(IService iService) {
this.iService = iService;
}
public String getServiceValue() {
return iService.serve();
}
}
@@ -0,0 +1,16 @@
package com.baeldung.di.spring;
public class MessageService implements IService {
private String message;
public MessageService(String message) {
this.message = message;
}
@Override
public String serve() {
return message;
}
}
@@ -0,0 +1,5 @@
package com.baeldung.di.spring;
public interface PersonDao {
}
@@ -0,0 +1,8 @@
package com.baeldung.di.spring;
import org.springframework.stereotype.Component;
@Component
public class PersonDaoImpl implements PersonDao {
}
@@ -0,0 +1,14 @@
package com.baeldung.di.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringBeansConfig {
@Bean
public AudioBookService audioBookServiceGenerator() {
return new AudioBookServiceImpl();
}
}
@@ -0,0 +1,18 @@
package com.baeldung.di.spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({ SpringBeansConfig.class })
@ComponentScan("com.baeldung.di.spring")
public class SpringMainConfig {
@Bean
public BookService bookServiceGenerator() {
return new BookServiceImpl();
}
}
@@ -0,0 +1,20 @@
package com.baeldung.di.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class SpringPersonService {
@Autowired
private PersonDao personDao;
public PersonDao getPersonDao() {
return personDao;
}
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
}
@@ -0,0 +1,14 @@
package com.baeldung.di.spring;
public class StaticServiceFactory {
public static IService getService(int number) {
switch (number) {
case 1:
return new MessageService("Foo");
case 0:
return new IndexService();
default:
throw new IllegalArgumentException("Unknown parameter " + number);
}
}
}
@@ -0,0 +1,20 @@
package com.baeldung.di.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class UserService {
@Autowired
private AccountService accountService;
public AccountService getAccountService() {
return accountService;
}
public void setAccountService(AccountService accountService) {
this.accountService = accountService;
}
}
@@ -0,0 +1,10 @@
package com.baeldung.methodinjections;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.baeldung.methodinjections")
public class AppConfig {
}
@@ -0,0 +1,19 @@
package com.baeldung.methodinjections;
import java.util.Collection;
import org.springframework.stereotype.Component;
@Component
public class Grader {
public String grade(Collection<Integer> marks) {
boolean result = marks.stream()
.anyMatch(mark -> mark < 45);
if (result) {
return "FAIL";
}
return "PASS";
}
}
@@ -0,0 +1,45 @@
package com.baeldung.methodinjections;
import java.util.ArrayList;
import java.util.Collection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component("schoolNotification")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class SchoolNotification {
@Autowired
Grader grader;
private String name;
private Collection<Integer> marks;
public SchoolNotification(String name) {
this.name = name;
this.marks = new ArrayList<Integer>();
}
public String addMark(Integer mark) {
this.marks.add(mark);
return this.grader.grade(this.marks);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Collection<Integer> getMarks() {
return marks;
}
public void setMarks(Collection<Integer> marks) {
this.marks = marks;
}
}
@@ -0,0 +1,27 @@
package com.baeldung.methodinjections;
import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.stereotype.Component;
@Component("studentBean")
public class Student {
private String id;
/**
* Injects a prototype bean SchoolNotification into Singleton student
*/
@Lookup
public SchoolNotification getNotification(String name) {
// spring overrides and returns a SchoolNotification instance
return null;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
@@ -0,0 +1,21 @@
package com.baeldung.methodinjections;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Lookup;
import org.springframework.stereotype.Component;
@Component("studentService")
public abstract class StudentServices {
private Map<String, SchoolNotification> notes = new HashMap<>();
@Lookup
protected abstract SchoolNotification getNotification(String name);
public String appendMark(String name, Integer mark) {
SchoolNotification notification = notes.computeIfAbsent(name, exists -> getNotification(name));
return notification.addMark(mark);
}
}
@@ -0,0 +1,11 @@
package com.baeldung.sample;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
FooService fooService = ctx.getBean(FooService.class);
fooService.doStuff();
}
}
@@ -0,0 +1,10 @@
package com.baeldung.sample;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.baeldung.sample")
public class AppConfig {
}
@@ -0,0 +1,5 @@
package com.baeldung.sample;
public class Bar {
}
@@ -0,0 +1,13 @@
package com.baeldung.sample;
import org.springframework.stereotype.Component;
@FormatterType("Bar")
@Component
public class BarFormatter implements Formatter {
public String format() {
return "bar";
}
}
@@ -0,0 +1,5 @@
package com.baeldung.sample;
public class Foo {
}
@@ -0,0 +1,5 @@
package com.baeldung.sample;
public class FooDAO {
}
@@ -0,0 +1,13 @@
package com.baeldung.sample;
import org.springframework.stereotype.Component;
@FormatterType("Foo")
@Component
public class FooFormatter implements Formatter {
public String format() {
return "foo";
}
}
@@ -0,0 +1,17 @@
package com.baeldung.sample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class FooService {
@Autowired
@FormatterType("Foo")
private Formatter formatter;
public String doStuff() {
return formatter.format();
}
}
@@ -0,0 +1,7 @@
package com.baeldung.sample;
public interface Formatter {
String format();
}
@@ -0,0 +1,17 @@
package com.baeldung.sample;
import org.springframework.beans.factory.annotation.Qualifier;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Qualifier
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface FormatterType {
String value();
}