【JavaEE进阶】Spring 更简单的读取和存储对象

2023-10-16 15:06:33 浏览数 (1)

一. 存储Bean对象

1. 配置扫描路径

配置扫描路径是使用注解之前的前置工作,是非常重要的,是必须的操作项.只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中.

首先创建一个Spring项目.创建好后,第一步就是配置扫描路径:在resources目录中创建一个spring-config.xml文件.然后在spring-config.xml添加如下配置:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package=""></content:component-scan>
</beans>

<content:component-scan base-package=""></content:component-scan>base-package=""的值设置为需要扫描对象的根路径.注意:这个根路径是从java目录开始的.

2. 添加注解存储 Bean 对象

想要将对象存储在spring中,有两种注解类型可以实现: 使用类注解(五大类注解):

  • @Component:@Component是一个通用的注解,表示一个类被标记为可被Spring容器扫描和管理的组件。使用@Component注解可以将一个普通的Java类注册为一个SpringBean。
  • @Controller:@Controller注解用于标识一个类是Spring MVC中的控制器。控制器负责处理用户请求,并返回相应的视图或数据。通过@Controller注解标记的类会被Spring自动检测并注册为一个控制器Bean。
  • @Service:@Service注解用于标识一个类是业务逻辑层的组件。通常,我们使用@Service注解将一个服务类标记为Spring管理的Bean,它负责处理业务逻辑的实现。
  • @Repository:@Repository注解用于标识一个类是数据访问层的组件。通常,我们使用@Repository注解将一个DAO(数据访问对象)类标记为Spring管理的Bean,它负责封装与数据库的交互操作。
  • @Configuration:用于标识一个类为配置类,通常用于定义Bean的创建、装配和其他配置信息。它用于告诉Spring容器该类包含了Bean的定义和依赖关系,可通过@Configuration注解的类创建一个Java-based配置来代替XML配置文件。

方法注解

  • @Bean:@Bean注解用于标记一个方法是一个产生Bean实例的工厂方法。通常,我们将@Bean注解放置在@Configuration注解的类中的方法上。被@Bean注解标注的方法会被Spring容器调用,并将其返回的对象注册为一个Bean,可以通过名称或类型进行访问。

拓展注解:

  • @Autowired:@Autowired是一个自动装配注解,用于实现依赖注入。当一个类需要依赖其他类的实例时,可以使用@Autowired注解自动将依赖注入到目标类中。Spring会根据类型进行自动查找并装配对应的Bean。
2.1 使用五大类注解存储Bean

首先,我们来了解如何使用五大类注解来储存对象

@Controller

代码语言:javascript复制
package com.spring.demo;

import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    public void sayHi() {
        System.out.println("UserController sayHi!");
    }
}

在扫描路径下创建该UserController类.并在类上加@Controller注解,此时就将Bean存储到容器中了.

接下来就是从 Spring 中读取出我们的对象,这里还是先使用依赖查找的方式来获取 Bean,使用五大类注解,默认情况下,Bean 的名字就是原类名首字母小写(小驼峰).

代码语言:javascript复制
import com.spring.demo.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        //1.获取 srping 容器
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //2.获取 bean 对象
        //获取对象时使用类名的小驼峰形式作为 name 参数
        UserController userController =  context.getBean("userController", UserController.class);
        //3.使用 bean
        userController.sayHi();
    }
}

运行结果:

注意:要将Bean存储到Spring中需要满足两个条件:

  1. 使用五大类注解创建的类
  2. 必须在配置的扫描路径下.(包括子包)

扫描路径也叫做根路径.两个条件缺一不可.

为什么要设置根路径? 设置根路径其实也是为了提高程序的性能,因为如果不设置根路径,Spring 就会扫描项目文件中所有的目录,但并不是所有类都需要储存到 Spring当中,这样性能就会比较低,设置了根路径,Spring 就只扫描该根路径下所有的目录就可以了,提高了程序的性能。下来我们演示一下没有配置扫描路径下的情况:

还需要知道的是使用注解存储的 Bean 和使用XML存储的的 Bean 是可以一同使用的,比如我们将刚刚有问题的Student重新通过XML的方式进行存储.

注意:默认情况下,使用原类名首字母小写就能读取到Bean对象.特例情况:原类名如果首字母和第二个字母都是大写的情况下,那么bean名称就是原类名.

@Service 启动类中代码:

代码语言:javascript复制
//1.获取 srping 容器
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //2.获取 bean 对象
        //获取对象时使用类名的小驼峰形式作为 name 参数
        UserService userService =  context.getBean("userService", UserService.class);
        //3.使用 bean
        userService.sayHi();

UserService类:

代码语言:javascript复制
package com.spring.demo;

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public void sayHi(){
        System.out.println("UserService sayHi!");
    }
}

运行结果:

其余三种使用方式相同,此处不再做介绍.

2.2 为什么要有五大类注解?

既然都五大类完成的是同样的工作,那为什么要有五大类注解呢?

其实五大类注解主要是为了规范 Java 项目的代码,Java 项目的标准分层如下:

  1. 控制层(Controller)
  2. 服务层(Service)
  3. 数据持久层(Dao)

而五大类注解便是对应着不同的层级别使用的,让程序猿看到某一个注解就可以明确这个了类是做什么的。 程序的⼯程分层,调⽤流程如下:

包括企业中也是按照这样的结构来将项目分层的,典型的比如阿里,它只是在标准分层在服务层(Service)做了一个扩展,划分的更加细致详细了.

五大类注解主要起到的是“见名知意”的作用,代码层面上来看,作用是类似的.查看五大类源码可知: 五大类的源码中除了 @Component 以外,其他四大类注解中都包含了 @Component 注解的功能,这四大类注解都是基于 @Component 实现的,是 @Component 拓展。

2.3 有关获取Bean参数的命名规则

上文中在使用依赖查找的方式获取Bean时,我们讲到了getBean方法的BeanName是使用类名的小驼峰形式(即类名的首字母小写)以及第一个字母和第二个字母都大写情况下的特例.

注意:BeanName的规范命名规则并不是 Spring 独创的,而依照 Java 标准库的规则进行的。

BeanName的规范命名规则:

  1. 如果类名不存在或类名为空字符串,BeanName为原类名。
  2. 如果类名字长度大于1,且第一个与第二个字符为大写,BeanName为原类名。
  3. 其他情况,BeanName为原类名的小驼峰形式.

3. 使用方法注解储存 Bean 对象

3.1 方法注解储存对象的用法

类注解是添加到某个类上的,而方法注解是放到某个方法上的.在Spring框架的设计中,方法注解@Bean要配合类注解才能将对象正常存储到Spring容器中.

举个

0 人点赞