Skip to content

Instantly share code, notes, and snippets.

@boaglio
Last active February 27, 2023 12:42
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save boaglio/74eee7aaeeee08dc17e966b6438f54b3 to your computer and use it in GitHub Desktop.
Save boaglio/74eee7aaeeee08dc17e966b6438f54b3 to your computer and use it in GitHub Desktop.
Anotações do Spring Core 5

Intro

Pedi para a OpenAI listar todas as anotações do Spring Core 5 e exemplos.

Juntando as respostas, esse foi o resultado:

AliasFor

Essa anotação é usada para indicar que um determinado atributo ou parâmetro de uma anotação é um alias para outro atributo ou parâmetro. Isso é útil quando duas anotações diferentes compartilham um nome de atributo com um significado semelhante. Com a anotação @AliasFor, podemos indicar que um alias de um atributo em uma anotação é na verdade um apelido para outro atributo em outra anotação.

Exemplo:

@Foo
public @interface Foo {
    @AliasFor(annotation = Bar.class, attribute = "name")
    String value() default "";
}

@Bar
public @interface Bar {
    @AliasFor(annotation = Foo.class, attribute = "value")
    String name() default "";
}

Suponha que temos duas anotações, @Foo e @Bar, que compartilham um nome de atributo "value" com significados semelhantes. Podemos usar a anotação @AliasFor para indicar que o atributo "value" em @Foo é um alias para o atributo "name" em @Bar e vice-versa.

Autowired

Autowired é uma anotação que pode ser usada para injetar automaticamente dependências em um bean gerenciado pelo Spring.

Exemplo:

public class MyService {
    
    private MyRepository repository;
    
    @Autowired
    public MyService(MyRepository repository) {
        this.repository = repository;
    }
    
    // ...
}

Neste exemplo, a anotação @Autowired é usada para injetar uma instância de MyRepository no construtor do MyService. Quando o Spring instanciar o MyService, ele automaticamente injetará a instância apropriada de MyRepository usando sua configuração de injeção de dependência.

Bean

Bean é uma anotação que pode ser usada em conjunto com um método de configuração do Spring para indicar que o método retorna um bean gerenciado pelo Spring.

Exemplo:

@Configuration
public class MyConfig {
    
    @Bean
    public MyService myService() {
        return new MyService();
    }
    
    // ...
}

Neste exemplo, a anotação @Bean é usada em conjunto com o método myService() para indicar que o método retorna uma instância de MyService, que será gerenciada pelo Spring como um bean dentro do contexto de aplicativo do Spring. Isso permite que você escreva métodos de configuração do Spring que retornam beans gerenciados pelo Spring.

Component

Component é uma anotação que pode ser usada para indicar que uma classe é um componente gerenciado pelo Spring.

Exemplo:

@Component
public class MyComponent {
    
    // ...
}

Neste exemplo, a anotação @Component é usada para indicar que MyComponent é um componente gerenciado pelo Spring. O Spring criará uma instância de MyComponent e o gerenciará como um bean dentro do contexto de aplicativo do Spring. Isso permite que você escreva classes que são gerenciadas automaticamente pelo Spring, em vez de instanciá-las manualmente.

Conditional

Conditional é uma anotação que pode ser usada para indicar que um bean só deve ser criado se uma determinada condição for atendida.

Exemplo:

@Component
@Conditional(MyCondition.class)
public class MyComponent {
    
    // ...
}

Neste exemplo, a anotação @Conditional é usada para indicar que MyComponent só deve ser criado se a classe MyCondition retornar verdadeiro. Isso permite que você crie beans condicionalmente com base em qualquer condição que você possa querer verificar.

@Configuration

Configuration é uma anotação que pode ser usada para indicar que uma classe contém métodos de configuração do Spring.

Exemplo:

@Configuration
public class MyConfig {
    
    @Bean
    public MyService myService() {
        return new MyService();
    }
    
    // ...
}

Neste exemplo, a anotação @Configuration é usada para indicar que MyConfig contém métodos de configuração do Spring. O método myService() é um método de configuração que retorna uma instância de MyService, que será gerenciada pelo Spring como um bean dentro do contexto de aplicativo do Spring. Isso permite que você escreva classes que contêm métodos de configuração do Spring, em vez de configurar o Spring por meio de XML ou outros meios.

DependsOn

DependsOn é uma anotação que pode ser usada para indicar que um bean deve ser criado depois de um ou mais outros beans.

Exemplo:

@Component
@DependsOn({"beanOne", "beanTwo"})
public class MyComponent {
    
    // ...
}

Neste exemplo, a anotação @DependsOn é usada para indicar que MyComponent deve ser criado depois que os beans "beanOne" e "beanTwo" forem criados. Isso pode ser útil se você tiver beans que dependem de outros beans para funcionar corretamente.

EnableAspectJAutoProxy

EnableAspectJAutoProxy: Essa anotação é usada para habilitar o suporte a proxies baseados em aspectos do Spring em uma aplicação. Ao ser adicionada em uma classe de configuração, essa anotação habilita a criação de proxies baseados em aspectos do Spring para classes anotadas com @Aspect.

Exemplo:

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    @Bean
    public MyAspect myAspect() {
        return new MyAspect();
    }
}

EventListener

EventListener é uma anotação que é usada em métodos de qualquer bean para indicar que ele deve ser registrado como um ouvinte de eventos do Spring.

@Service
public class MyService {
    
    @EventListener
    public void handleMyEvent(MyEvent event) {
        // ...
    }
    
}

Neste exemplo, a classe MyService possui um método anotado com @EventListener, o que indica que ele deve ser registrado como um ouvinte de eventos do Spring.

Quando um evento do tipo MyEvent é publicado no contexto do Spring, o método handleMyEvent será chamado automaticamente com o objeto de evento como argumento.

ExceptionHandler

ExceptionHandler: Essa anotação é usada para definir um método que lida com exceções lançadas em um controlador de requisições do Spring. O método anotado com @ExceptionHandler deve ter como parâmetro um objeto de exceção que será tratado por ele.

Exemplo:

@ControllerAdvice
public class MyExceptionHandler {
    @ExceptionHandler(RuntimeException.class)
    public ResponseEntity<String> handleRuntimeException(RuntimeException e) {
        return new ResponseEntity<>("Ocorreu um erro: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

Import

Import é uma anotação que é usada em uma classe de configuração para importar outras configurações, permitindo que as configurações sejam compostas de várias classes.

Exemplo:

@Configuration
@Import({DatabaseConfig.class, SecurityConfig.class})
public class AppConfig {
    // ...
}

Neste exemplo, a classe AppConfig é anotada com @Import, importando as classes DatabaseConfig e SecurityConfig para compor a configuração.

Com isso, a classe AppConfig terá acesso aos beans definidos nas classes importadas, permitindo que a configuração seja composta de várias classes.

ImportResource

ImportResource é uma anotação que é usada em uma classe de configuração para importar um arquivo XML de configuração Spring.

Exemplo:

@Configuration
@ImportResource("classpath:applicationContext.xml")
public class AppConfig {
    // ...
}

Neste exemplo, a classe AppConfig é anotada com @ImportResource, importando o arquivo XML applicationContext.xml para a configuração.

Com isso,Config` terá acesso aos beans definidos no arquivo XML importado, permitindo que a configuração seja definida em um arquivo XML separado.

Inject

Inject: Essa anotação é usada para injetar uma dependência em um campo, método ou construtor de uma classe gerenciada pelo Spring. O Spring procura por um bean que corresponda ao tipo do campo, método ou construtor anotado com @Inject e o injeta automaticamente.

Exemplo:

@Service
public class MyService {
    private final MyRepository repository;

    @Inject
    public MyService(MyRepository repository) {
        this.repository = repository;
    }

    public void doSomething() {
        // usa o repositório injetado aqui
    }
}

Lazy

Lazy é uma anotação que pode ser usada para indicar que um bean deve ser inicializado apenas quando for necessário, em vez de ser inicializado durante a inicialização do aplicativo.

Exemplo:

@Component
@Lazy
public class MyComponent {
    
    // ...
}

Neste exemplo, a anotação @Lazy é usada para indicar que MyComponent deve ser inicializado apenas quando for necessário, em vez de ser inicializado durante a inicialização do aplicativo. Isso pode ajudar a melhorar o desempenho do seu aplicativo, especialmente se você tiver muitos beans que não são usados o tempo todo.

Order

Order é uma anotação que pode ser usada para especificar a ordem em que os beans devem ser criados.

Exemplo:

@Component
@Order(1)
public class MyComponent1 {
    
    // ...
}

@Component
@Order(2)
public class MyComponent2 {
    
    // ...
}

Neste exemplo, as anotações @Order são usadas para especificar a ordem em que MyComponent1 e MyComponent2 devem ser criados. MyComponent1 terá a ordem 1 e MyComponent2 terá a ordem 2. Isso pode ser útil se você tiver beans que precisam ser criados em uma ordem específica.

Primary

Primary é uma anotação que pode ser usada para indicar que um bean é o principal ou o "padrão" para um determinado tipo.

Exemplo:

@Component
@Primary
public class MyComponent {
    
    // ...
}

Neste exemplo, a anotação @Primary é usada para indicar que MyComponent é o bean principal ou padrão para o tipo correspondente. Isso significa que, se houver vários beans do mesmo tipo, o bean com a anotação @Primary será usado por padrão, a menos que outro bean seja especificamente solicitado.

Profile

Profile é uma anotação que pode ser usada para indicar que um bean só deve ser criado se um perfil específico estiver ativo.

Exemplo:

@Component
@Profile("dev")
public class MyComponent {
    
    // ...
}

Neste exemplo, a anotação @Profile é usada para indicar que MyComponent só deve ser criado se o perfil "dev" estiver ativo. Isso permite que você crie beans condicionalmente com base em qual perfil está ativo, o que pode ser útil em ambientes de desenvolvimento versus produção.

PropertySource

PropertySource é uma anotação que pode ser usada para especificar a localização de um arquivo de propriedades externo.

@Configuration
@PropertySource("classpath:my.properties")
public class MyConfiguration {
    
    @Autowired
    Environment env;
    
    @Bean
    public MyBean myBean() {
        MyBean bean = new MyBean();
        bean.setName(env.getProperty("my.bean.name"));
        return bean;
    }
}

Neste exemplo, a anotação @PropertySource é usada para especificar que as propriedades em um arquivo chamado my.properties devem ser usadas para preencher as propriedades de beans nesta configuração. As propriedades podem ser recuperadas do objeto Environment injetado no bean usando o método getProperty.

Qualifier

Qualifier é uma anotação que pode ser usada em conjunto com a anotação @Autowired para especificar qual bean específico deve ser injetado quando há várias instâncias do mesmo tipo disponíveis.

Exemplo:

public class MyService {
    
    private MyRepository primaryRepository;
    
    private MyRepository secondaryRepository;
    
    @Autowired
    public MyService(@Qualifier("primary") MyRepository primaryRepository, 
                     @Qualifier("secondary") MyRepository secondaryRepository) {
        this.primaryRepository = primaryRepository;
        this.secondaryRepository = secondaryRepository;
    }
    
    // ...
}

Neste exemplo, a anotação @Qualifier é usada para especificar que primaryRepository deve ser injetado com o bean identificado pelo qualificador "primary", e secondaryRepository deve ser injetado com o bean identificado pelo qualificador "secondary". Isso permite que você injete beans específicos quando há várias instâncias do mesmo tipo disponíveis.

RestController

RestController é uma anotação que combina as anotações @Controller e @ResponseBody. Isso é útil quando você está criando um controlador REST e deseja que os resultados dos métodos do controlador sejam automaticamente serializados para JSON ou XML.

Exemplo:

@RestController
@RequestMapping("/api")
public class MyRestController {
    
    @Autowired
    private MyService myService;
    
    @GetMapping("/data")
    public List<MyData> getData() {
        return myService.getData();
    }
    
    // ...
}

Neste exemplo, a anotação @RestController é usada para indicar que a classe MyRestController é um controlador REST, e a anotação @GetMapping é usada para mapear a URL /api/data para o método getData(). O resultado do método é automaticamente serializado para JSON ou XML, dependendo da configuração do projeto.

Scope e Lookup

Scope e Lookup é uma anotação que é usada em métodos de uma classe com escopo de protótipo para obter um bean gerenciado pelo Spring. A cada chamada do método, o Spring retorna uma nova instância do bean solicitado.

@Service
@Scope("prototype")
public class MyService {
    
    public void doSomething() {
        OtherService otherService = getOtherService();
        // ...
    }
    
    @Lookup
    public OtherService getOtherService() {
        // Este método será substituído em tempo de execução pelo Spring
        return null;
    }
    
    // ...
}

Neste exemplo, a anotação @Scope é usada para indicar que a classe MyService tem escopo de protótipo. A anotação @Lookup é usada no método getOtherService() para indicar que o Spring deve substituir o método em tempo de execução e retornar uma nova instância de OtherService a cada chamada.

Transactional

Transactional: Essa anotação é usada para marcar um método ou classe que deve ser executado dentro de uma transação. Quando um método ou classe é anotado com @Transactional, o Spring cria uma transação para a execução do método e a gerencia automaticamente.

Exemplo:

@Service
public class MyService {
    @Autowired
    private MyRepository repository;

    @Transactional
    public void doSomething() {
        // operações do repositório que ocorrem dentro da transação
    }
}

Value

Value é uma anotação que pode ser usada para injetar valores em um bean gerenciado pelo Spring a partir de propriedades de configuração externas ou outras fontes de dados.

Exemplo:

@Component
public class MyComponent {
    
    @Value("${my.property}")
    private String myProperty;
    
    // ...
}

Neste exemplo, a anotação @Value é usada para injetar o valor da propriedade de configuração externa "my.property" na variável myProperty. O valor será automaticamente convertido para o tipo adequado, que neste caso é uma String. Isso permite que você injete valores de configuração externos em seus beans gerenciados pelo Spring.

PostConstruct

PostConstruct é uma anotação que pode ser usada em um método de inicialização de um bean.

Exemplo:

@Component
public class MyComponent {
    
    @PostConstruct
    public void init() {
        // lógica de inicialização aqui
    }
    
    // ...
}

Neste exemplo, a anotação @PostConstruct é usada para marcar o método init como o método de inicialização de MyComponent. Esse método será chamado imediatamente após a criação do bean, permitindo que você execute qualquer lógica de inicialização necessária.

PreDestroy

PreDestroy é uma anotação que pode ser usada em um método de destruição de um bean.

Exemplo:

@Component
public class MyComponent {
    
    @PreDestroy
    public void destroy() {
        // lógica de destruição aqui
    }
    
    // ...
}

Neste exemplo, a anotação @PreDestroy é usada para marcar o método destroy como o método de destruição de MyComponent. Esse método será chamado imediatamente antes da destruição do bean, permitindo que você execute qualquer lógica de destruição necessária.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment