El camino hacia el progreso de Spring Annotation: explicación súper detallada

I. Introducción

Spring es un punto importante de conocimiento del marco que no podemos evitar cuando aprendemos Java. Los puntos de conocimiento centrales en Spring son IOC y AOP. La principal inversión de control de IOC es inicializar y cargar el Bean en el contenedor, pero ¿cómo está el Bean? en el contenedor, aquí podemos usar anotaciones de resorte o configuración XML de resorte para lograr.

El método de anotación de Spring reduce el contenido del archivo de configuración, que es más conveniente para nuestra gestión de proyectos, y el uso de anotaciones puede mejorar enormemente nuestra eficiencia de desarrollo.

A continuación, presentamos algunas anotaciones de uso común en primavera.

Dos: anotación de clase de componente

@component: Anota una clase de Spring Bean común. @Repository: anota una clase de componente Dao. @service: anota una clase de componente de lógica empresarial. @Controller: anota una clase de componente de controlador. Estas son algunas de las anotaciones que se utilizan relativamente alto en el desarrollo habitual. Estas anotaciones son esencialmente el mismo tipo de anotaciones, con el mismo uso y la misma función, y la diferencia radica en los diferentes tipos de componentes identificados. @component puede reemplazar @Repository, @Service, @Controller, porque estas tres anotaciones están marcadas por @Component. el código se muestra a continuación

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller{
    string  value()  default “”;
    }

imagen

②: ejemplos detallados

  • Cuando un componente representa la capa de acceso a datos (Dao), usamos @Repository para la anotación, de la siguiente manera
@Repository
public class HappyDaoImpl implements HappyDao{
private final static Logger LOGGER = LoggerFactory.getLogger(HappyDaoImpl .class);
public void  club(){
        //do something ,like drinking and singing
    }
}
  • Cuando un componente representa la capa empresarial, usamos @Service para la anotación, de la siguiente manera
@Service(value="goodClubService")
//使用@Service注解不加value ,默认名称是clubService
public class ClubServiceImpl implements ClubService {
    @Autowired
    private ClubDao clubDao;
  
    public void doHappy(){
        //do some Happy
    }
 }
  • Cuando un componente se utiliza como capa de control para la interacción de front-end, se anota con @Controller, de la siguiente manera
@Controller
public class HappyController {
	@Autowired //下面进行讲解
    private ClubService clubService;
    
	// Control the people entering the Club
	// do something
}
/*Controller相关的注解下面进行详细讲解,这里简单引入@Controller*/

③: Resumen

La clase java en las observaciones se trata como una instancia de Bean, y el nombre de la instancia de Bean es la letra minúscula inicial de la clase Bean por defecto, y otras partes permanecen sin cambios. @Service también puede personalizar el nombre del Bean, pero debe ser único: 2. Intente reemplazar la anotación @Component con la clase de anotación del componente correspondiente. En futuras versiones de Spring, @Controller, @Service y @Resposity llevarán más semántica . ¡Y fácil de desarrollar y mantener! 3. Después de especificar que ciertas clases se pueden usar como clases de Spring Bean, es mejor dejar que Spring busque la ruta especificada y agregue la siguiente configuración en el archivo de configuración de Spring:

<!-- 自动扫描指定包及其子包下的所有Bean类 -->
<context:component-scan base-package="org.springframework.*"/>

Tres: anotaciones de uso común al ensamblar beans

①: Introducción a la anotación

@Autowired: pertenece al paquete org.springframework.beans.factory.annotation de Spring, que se puede usar para anotar atributos de clase, constructores y métodos @Resource: no pertenece a las anotaciones de Spring, pero proviene de JSR-250 en java Bajo el .annotation package, use la anotación para especificar el bean colaborador para el bean de destino. Los métodos @postConstruct y @preDestory implementan las operaciones realizadas antes de que se inicialice y destruya el bean.

②: Ejemplos

@Autowired

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, 
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true;
}
@Controller
public class HappyController {
	@Autowired //默认依赖的ClubDao 对象(Bean)必须存在
	//@Autowired(required = false) 改变默认方式
	@Qualifier("goodClubService")
    private ClubService clubService;
    
	// Control the people entering the Club
	// do something
}
  • @Recurso
@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {
 String name() default "";
 Class type() default java.lang.Object.class;
public class AnotationExp {
    @Resource(name = "HappyClient")
    private HappyClient happyClient;
    
    @Resource(type = HappyPlayAno .class)
    private HappyPlayAno happyPlayAno;
}

③: Resumen

  • Similitudes: @Resource es equivalente a @Autowired y se puede marcar en el método de establecimiento de un campo o propiedad.

  • Diferencias: el proveedor @Autowired es una anotación de primavera, @Resource es una anotación de javax.annotation, pero proviene de JSR-250, proporcionada por J2EE, y requiere JDK1.6 o superior.

  • El método de inyección @Autowired solo se inyecta según el Tipo; @Resource se inyecta automáticamente según el Nombre de forma predeterminada, y también se proporciona la inyección según el Tipo

  • Propiedades: La anotación @Autowired se puede usar para anotar las propiedades, constructores y métodos de la clase. De forma predeterminada, los objetos de los que depende el dispositivo deben existir (los beans están disponibles). Si necesita cambiar este método predeterminado, puede establecer su propiedad requerida en false. Otro punto importante es que la anotación @Autowired se ensambla por tipo de forma predeterminada. Si el contenedor contiene varios beans del mismo tipo, se informará una excepción de que no se puede encontrar el tipo de bean especificado cuando se inicie el contenedor, y la solución debe combinarse con ** @ La anotación Calificador ** está calificada y especifica el nombre del bean inyectado.

  • @Resource tiene dos atributos importantes, nombre y tipo. El atributo name especifica byName. Si no se especifica el atributo name, cuando la anotación está marcada en el campo, el nombre del campo se lee de forma predeterminada como el nombre del bean para encontrar el objeto dependiente. Cuando la anotación está marcada en el establecedor método de la propiedad, el nombre del atributo se toma como el nombre del bean de forma predeterminada Buscar objetos dependientes. Cabe señalar que la anotación @Resource recurrirá al ensamblado por tipo. Pero una vez que se especifica el atributo de nombre, solo se puede ensamblar por nombre.

  • El uso de la anotación @Resource es más flexible, puede especificar el nombre, también puede especificar el tipo; la anotación @Autowired es fácil de lanzar excepciones al ensamblar, especialmente cuando hay varios tipos de beans para ensamblar y el método de anotación necesita para ser agregado @Qualifer Qualify.

               [Spring中 @Autowired注解与@Resource注解的区别](http://qiangmzsx.blog.51cto.com/2052549/1359952)
    

Nota: Al usar @Resource, también debe prestar atención a agregar archivos de configuración a Spring, si el escaneo de componentes no está configurado

<context:component-scan> 
<!--<context:component-scan>的使用,是默认激活<context:annotation-config>功能-->

Debes configurar annotation-config

<context:annotation-config/>

四 : @Component vs @Configuration y @Bean

①: Breve introducción

El equipo oficial de Spring dice que @Component puede reemplazar las anotaciones de @Configure. De hecho, también podemos averiguarlo mirando el código fuente, de la siguiente manera

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component  //看这里!!!
public @interface Configuration {
    String value() default "";

Aunque se puede sustituir, ¡todavía hay una diferencia entre las dos anotaciones!
Siempre que se use la anotación Bean en los métodos, es un poco similar al trabajo de fábrica. Cuando usamos la anotación @Bean, podemos usar continuamente múltiples anotaciones que se usan para definir beans. Por ejemplo, la anotación @Qualifier se usa para definir el nombre del método de fábrica, y se utiliza la anotación @Scope Defina el alcance del bean, como singleton o prototype.

El núcleo del nuevo soporte de configuración de Java en Spring es la clase anotada @Configuration. Estas clases incluyen principalmente métodos anotados @Bean para definir instancias, configuración y lógica de inicialización para objetos administrados por el contenedor IOC de Spring.

Usar @Configuration para anotar una clase significa que el contenedor IOC de Spring puede usarla como un recurso para la definición de bean.

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

Esto es muy similar al archivo xml de primavera

<beans>
    <bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>

La anotación @Bean juega el mismo papel que el elemento.
②: Ilustra @Component y @Configuration

@Configuration
public static class Config {
    @Bean
    public SimpleBean simpleBean() {
        return new SimpleBean();
    }
    @Bean
    public SimpleBeanConsumer simpleBeanConsumer() {
        return new SimpleBeanConsumer(simpleBean());
    }
}
@Component
public static class Config {
    @Bean
    public SimpleBean simpleBean() {
        return new SimpleBean();
    }
    @Bean
    public SimpleBeanConsumer simpleBeanConsumer() {
        return new SimpleBeanConsumer(simpleBean());
    }
}

El primer código funciona, como se esperaba, SimpleBeanConsumer obtendrá un enlace al singleton SimpleBean. La segunda configuración es completamente incorrecta, porque Spring creará un bean singleton SimpleBean, pero SimpleBeanConsumer obtendrá otra instancia de SimpleBean (que es equivalente a llamar a new SimpleBean () directamente, este bean no es administrado por Spring), tanto el nuevo SimpleBean () instancia está fuera del control de contexto de Spring

③: Resumen de motivos

Use @configuration, por lo que el método marcado como @bean será envuelto en un contenedor CGLIB Funciona como la primera llamada de este método, luego se ejecutará el cuerpo original y el objeto final estará registrado en el contexto de primavera. Todas las llamadas posteriores solo devuelven los beans recuperados del contexto.

En el segundo bloque de código anterior, el nuevo SimpleBeanConsumer (simpleBean) solo llama a un método java puro. Para corregir el segundo bloque de código, podemos hacer

@Component
public static class Config {
    @Autowired
    SimpleBean simpleBean;

    @Bean
    public SimpleBean simpleBean() {
        return new SimpleBean();
    }

    @Bean
    public SimpleBeanConsumer simpleBeanConsumer() {
        return new SimpleBeanConsumer(simpleBean);
    }
}

Spring @Configuration vs @Component
conceptos básicos: @Configuration y @Bean

Cinco: anotación del módulo Spring MVC

①: anotaciones de uso común en módulos web

  • @Controller: Indica que esta clase actuará como un componente de la capa de control que interactúa con el front-end, proporcionando un comportamiento definido por la interfaz de servicio para acceder a la aplicación, interpretando la entrada del usuario, convirtiéndola en un modelo y luego tratando de presentar al usuario.
@Controller
public class HappyController {
	//do something
...
}

Spring MVC usa @Controller para definir controladores, también permite la detección automática de componentes definidos en la ruta de clases (ruta de escaneo configurada en el archivo de configuración) y el registro automático.

  • @RequestMapping: esta anotación se utiliza para asignar la URL a toda la clase de procesamiento o al método de procesamiento de solicitudes específico. ¡Solo puede usar comodines!
@Controller
@RequestMapping("/happy")
public class HappyController  {
  @Autowired
  private HappyService happyService;
  
  @RequestMapping(/hello/*)
  public void sayHello(){
		//请求为 /happy/hello/* 都会进入这个方法!
		//例如:/happy/hello/123   /happy/hello/adb
		//可以通过get/post 请求
  }
  @RequestMapping(value="/haha",method=RequestMethod.GET)
  public void sayHaHa(){
  //只能通过get请求
  }
...
}

@RequestMapping se puede aplicar tanto a nivel de clase como a nivel de método. Cuando se define a nivel de clase, indica que todas las solicitudes procesadas por el controlador se asignan a la ruta / favsoft. @RequestMapping puede usar el atributo de método para marcar el tipo de método que acepta. Si no se especifica el tipo de método, se puede usar el método HTTP GET / POST para solicitar datos, pero una vez que se especifica el tipo de método, los datos solo se pueden obtener usando ese tipo.

  • @RequestParam: enlaza los parámetros solicitados a los parámetros en el método. Hay un parámetro obligatorio. Por defecto, required = true, lo que significa que el parámetro debe pasarse. Si cambia el parámetro, puede pasarlo o no, puede configurar required = false.
 @RequestMapping("/happy")
  public String sayHappy(
  @RequestParam(value = "name", required = false) String name,
  @RequestParam(value = "age", required = true) String age) {
  //age参数必须传 ,name可传可不传
  ...
  }
  • @PathVariable: esta anotación se usa para modificar los parámetros del método, que cambiarán los parámetros del método modificados en variables uri disponibles (que se pueden usar para el enlace dinámico).
@RequestMapping(value="/happy/{dayid}",method=RequestMethod.GET)
public String findPet(@PathVariable String dayid, Model mode) {
//使用@PathVariable注解绑定 {dayid} 到String dayid
}

Los parámetros en @PathVariable pueden ser de cualquier tipo simple, como int, long, Date, etc. Spring lo convertirá automáticamente al tipo apropiado o lanzará una TypeMismatchException. Por supuesto, también podemos registrarnos para admitir tipos de datos adicionales.
@PathVariable admite el uso de expresiones regulares, lo que determina sus propiedades superpoderosas. Puede usar marcadores de posición en plantillas de ruta y puede establecer coincidencias de prefijos específicos, coincidencias de sufijos y otros formatos personalizados.

  • @RequestBody: @RequestBody significa que los parámetros del método deben estar vinculados al cuerpo de la solicitud HTTP.
@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body,@RequestBody User user){
   //可以绑定自定义的对象类型
}

@ResponseBody: @ResponseBody es similar a @RequestBody, su función es ingresar directamente el tipo de retorno en el cuerpo de la respuesta HTTP.

  • @ResponseBody se usa a menudo cuando se generan datos en formato JSON.
@RequestMapping(value = "/happy", method =RequestMethod.POST)
@ResponseBody
public String helloWorld() {    
return "Hello World";//返回String类型
}

@RestController: el controlador implementa la API REST, solo para servir JSON, XML u otros tipos de contenido personalizados, @RestController se usa para crear controladores de tipo REST y tipo @Controller. @RestController es de ese tipo, le evita escribir @RequestMapping y @ResponseBody repetidamente.
@ModelAttribute: @ModelAttribute puede actuar sobre un método o parámetro de método. Cuando actúa sobre un método, indica que el propósito del método es agregar uno o más atributos del modelo.

Este método admite los mismos tipos de parámetros que @RequestMapping, pero no se puede asignar directamente a una solicitud. Se llamará al método @ModelAttribute en el controlador antes de que se llame al método @RequestMapping.

El método @ModelAttribute tiene dos estilos: uno es agregar un atributo invisible y devolverlo. La otra es que el método acepta un modelo y agrega cualquier número de atributos del modelo. Los usuarios pueden elegir el estilo correspondiente según sus necesidades.

Seis: anotación del módulo de transacciones de Spring

①: notas de uso frecuente

Cuando se trata de operaciones de transacción en la capa dao o la capa de servicio, como la operación de reversión cuando falla la eliminación. Use ** @ Transactional ** como anotación, pero debe activarse en el archivo de configuración

<!-- 开启注解方式声明事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

②: Ejemplo

@Service
public class CompanyServiceImpl implements CompanyService {
  @Autowired
  private CompanyDAO companyDAO;

  @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
  public int deleteByName(String name) {

    int result = companyDAO.deleteByName(name);
    return result;
  }
  ...
}

③: Resumen

El mecanismo de propagación de transacciones y el mecanismo de aislamiento son más importantes.

imagen

Una imagen para aprender la propagación de transacciones de Spring

readOnly: los atributos de lectura y escritura de la transacción, que pueden ser verdaderos o falsos, verdadero es de solo lectura y el valor predeterminado es falso

rollbackFor: estrategia de reversión, reversión cuando se encuentra una excepción específica. Por ejemplo, si el ejemplo anterior encuentra una excepción, se revertirá

timeout (complementario): establezca el tiempo de espera en segundos

aislamiento: establezca el nivel de aislamiento de la transacción, el tipo enumerado, un total de cinco

imagen

Comprender a fondo el uso de @transactional en la  configuración de transacciones de Spring Spring y la propagación de transacciones y el nivel de aislamiento

Siete: publicación de blog de referencia

Enlace original: https://blog.csdn.net/u010648555/article/details/76299467

Supongo que te gusta

Origin blog.csdn.net/qq_44762290/article/details/107529356
Recomendado
Clasificación