五、Spring 框架,使用注解实现 Bean 容器的配置

文章目录

  • 一、使用注解开发的环境准备
  • 二、Spring 框架核心注解学习
    • 2.1 @Component
      • 2.1.1 通过注解来控制 Bean 的作用域(@Scope)
    • 2.2 @Component 的派生注解 (对应 WEB 开发的三层架构分层)
      • 2.2.1 @Repositor
      • 2.2.2 @Service
      • 2.2.3 @Controller
  • 三、使用 XML 与注解开发的学习总结
  • 四、使用 JAVA 的方式配置 Spring (XML 被完全取代成注解开发)
    • 4.1 Spring 上下文学习总结




一、使用注解开发的环境准备


       在 Spring 4.0版本之后,如果想要使用注解进行开发,就必须保证 aop 的依赖包正常导入了。否则可能会导致一些注解无法正常使用。
  • 使用注解开发的环境准备,搭建 maven 项目

    • 在pom.xml 中导入 Spring 依赖

      
        <dependency>
             <groupId>org.springframeworkgroupId>
             <artifactId>spring-webmvcartifactId>
             <version>5.2.0.RELEASEversion>
        dependency>
      
      • 依赖导入成功示意图
        五、Spring 框架,使用注解实现 Bean 容器的配置_第1张图片
    • 创建文件包路径,controller、dao、dto、service
      五、Spring 框架,使用注解实现 Bean 容器的配置_第2张图片

    • 创建 applicationContext.xml(Beans.xml),使用注解开发时,需要在该资源文件中导入约束,配置注解的支持!

      • 注:通过下面的 xml 代码可以发现,在该容器中只配置了注解支持,以及扫描指定包路径的注解,使其生效,并没有做 Bean 的任何处理。
      
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:context="http://www.springframework.org/schema/context"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
      		        https://www.springframework.org/schema/beans/spring-beans.xsd
      		        http://www.springframework.org/schema/context
      		        https://www.springframework.org/schema/context/spring-context.xsd">
      
          
          <context:annotation-config/>
          
          <context:component-scan base-package="com.sys.dto"/>
      beans>
      
    • 创建 User 实体类,引用注解对 Bean 进行装配

      // @Component:等同于
      @Component
      public class User {
      
      	// @Value:等同于
          @Value("姚青")
          private String name;
      
          public String getName() {
              return name;
          }
      
      	/* 注:在使用这种方式进行 Bean 的装配时,其实并没有使用过Set(),
      	都是通过 @Value 直接注入到 private String name; 当中*/
          public void setName(String name) {
              this.name = name;
          }
      
      }
      
    • 创建测试类,测试 Bean 的装配结果

      public class MyTest {
          public static void main(String[] args) {
              ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
              User user = context.getBean("user", User.class);
              System.out.println(user.getName());
          }
      }
      
    • 测试结果:从结果可以看出Bean成功注入了
      五、Spring 框架,使用注解实现 Bean 容器的配置_第3张图片

  • 注:在开发中大多数时候都是需要使用注解来进行的。




二、Spring 框架核心注解学习


       在上面第一节中的使用到了 @Component ,以及 @Value 注解来实现 Bean 的装配。

2.1 @Component


       @Component 是 Spring 框架中用来标记一个类为组件的注解。被 @Component 注解标记的类将会被 Spring 自动扫描并纳入到 Spring 容器中管理。

  • 使用方式:如第一节所示

2.1.1 通过注解来控制 Bean 的作用域(@Scope)


  • @Scope :用于定义Spring容器中Bean的作用域范围,它可以应用在类级别上。作用域决定了在Spring容器中创建的Bean的生命周期和可见范围。

    • 常用的@Scope作用域:

      • singleton(默认):每个Spring容器中只会创建一个Bean实例,并在整个容器的生命周期内都共享这个实例。

      • prototype:每次从容器中获取Bean时都会创建一个新的实例,即原型模式。每次获取都返回一个独立的Bean实例。

      • request:每个HTTP请求都会创建一个新的Bean实例,在同一次请求中共享。

      • session:每个HTTP session都会创建一个新的Bean实例,在同一个session中共享。

      • application:在Web应用启动时创建一个Bean实例,并在整个Web应用的生命周期内共享。

    • 代码示例:

      // @Component:等同于
      @Component
      @Scope("singleton")
      public class User {
      
      	// @Value:等同于
          @Value("姚青")
          private String name;
      
          public String getName() {
              return name;
          }
      
      	/* 注:在使用这种方式进行 Bean 的装配时,其实并没有使用过Set(),
      	都是通过 @Value 直接注入到 private String name; 当中*/
          public void setName(String name) {
              this.name = name;
          }
      
      }
      
  • 注:作用域仅在容器中有效,而不影响Bean在其他代码中的使用。



2.2 @Component 的派生注解 (对应 WEB 开发的三层架构分层)


       @Component 注解有几个派生注解,它们的作用和使用方式类似,都是代表将某个类注册到Spring中,装配Bean。但具体含义略有差异,涉及到不同场景下的注入、管理和特定功能。
       这些派生注解分别是:@Repository、@Service、@Controller

2.2.1 @Repositor

  • @Repositor: 用于标记数据访问层的组件,通常用于访问数据库或其他数据源。

    • 使用方式:
      @Repository
      public class UserRepository {
          //...
      }
      

2.2.2 @Service

  • @Service: 用于标记服务层的组件,通常用于定义业务逻辑。

    • 使用方式:
      @Service
      public class UserService {
          //...
      }
      

2.2.3 @Controller

  • @Controller: 用于标记Web层的组件,通常用于处理HTTP请求、响应和视图。

    • 使用方式:
      @Controller
      public class UserController {
          //...
      }
      


三、使用 XML 与注解开发的学习总结


  • XML 与注解

    • 通过 xml 来实现 Bean 的装配时,任何场景都可以适配!并且维护简单明了。

    • 通过注解来实现 Bean 的装配时,局限性较大,如果不是自己的类就无法使用!维护相对复杂。

  • XML 与注解的最佳搭配方式:

    • XML 用来管理bean;

    • 注解只负责完成属性的注入;

  • 注:在使用的过程中,需要注意必须让注解生效,也就是需要开启注解的支持

    	
    	<context:annotation-config/>
    	
      	<context:component-scan base-package="com.sys.dto"/>
    


四、使用 JAVA 的方式配置 Spring (XML 被完全取代成注解开发)


       使用注解将 XML 完全替代,这种写法是 Spring 框架的子项目 JavaConfig 的一种开发模式,将 Bean 的装配以及管理全部交给 Java 来实现!并且在 Spring 4.0 之后,JavaConfig 也成为了Spring 的一个核心功能。
       这种纯Java的配置方式,在 SpringBoot 中随处可见!

  • @Component :标注一个类为 Spring 容器的 Bean,(把普通pojo实例化到spring容器中,相当于配置文件中的)

  • @Configuration :这个也会Spring容器托管,注册到容器中,因为它本来就是一个@Component。被该注解标记的类被代表成配置类,和之前的 Beans.xml 差不多

  • @Bean :是 Spring 框架中用来定义 Bean 的注解之一。通过在方法上添加 @Bean 注解,相当于告诉 Spring 容器通过调用该方法来创建并管理一个 Bean 实例。相当于之前在 Beans.xml中 写的 < bean > 标签

    • 该方法的方法名就相当于< bean > 标签的 id 属性
    • 该方法的返回值,就相当于< bean >标签的 class 属性

  • @ComponentScan :指定要扫描的包,相当于 Beans.xml 的< context:component-scan base-package=“包路径”/ >

  • @Import :将其他配置文件引入到当前配置文件中,相当于 Beans.xml 的< import resource=“XXX”/ >



  • 代码示例:创建 maven 项目以及相关包路径

    • 创建实体类

      @Component
      public class User {
      
          @Value("姚青")
          private String name;
      
          public String getName() {
              return name;
          }
      
      }
      
    • 创建JavaConfig 配置类 – 相当于之前配置的 Bean.xml)

      @Configuration
      public class DemoConfig {
      
          @Bean
           public User getUser(){
               return new User(); // 返回要注入到 bean 的对象!
           }
      
      }
      
    • 创建测试类

      public class MyTest {
      
          public static void main(String[] args) {
              ApplicationContext context = new AnnotationConfigApplicationContext(DemoConfig.class);
              User user = context.getBean("getUser", User.class);
              System.out.println(user.getName());
          }
      
      }
      
    • 测试结果 :注入成功~~(打印姚青)



4.1 Spring 上下文学习总结

  • ApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml”);

    • 在之前使用 Beans.xml 进行 Bean 的管理和注入时,就通过 ClassPathXmlApplicationContext 来进行 Bean 的获取。
  • ApplicationContext context = new AnnotationConfigApplicationContext(DemoConfig.class);

    • 在之前使用注解进行 Bean 的管理和注入时,就通过 AnnotationConfigApplicationContext 来进行 Bean 的获取。

你可能感兴趣的:(spring,java,后端)