一. 存储Bean对象
1. 配置扫描路径
配置扫描路径是使用注解之前的前置工作,是非常重要的,是必须的操作项.只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring
中.
首先创建一个Spring项目.创建好后,第一步就是配置扫描路径:在resources
目录中创建一个spring-config.xml
文件.然后在spring-config.xml
添加如下配置:
<?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
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中需要满足两个条件:
- 使用五大类注解创建的类
- 必须在配置的扫描路径下.(包括子包)
扫描路径也叫做根路径.两个条件缺一不可.
为什么要设置根路径? 设置根路径其实也是为了提高程序的性能,因为如果不设置根路径,Spring 就会扫描项目文件中所有的目录,但并不是所有类都需要储存到 Spring当中,这样性能就会比较低,设置了根路径,Spring 就只扫描该根路径下所有的目录就可以了,提高了程序的性能。下来我们演示一下没有配置扫描路径下的情况:
还需要知道的是使用注解存储的 Bean 和使用XML存储的的 Bean 是可以一同使用的,比如我们将刚刚有问题的Student
重新通过XML的方式进行存储.
注意:默认情况下,使用原类名首字母小写就能读取到Bean对象.特例情况:原类名如果首字母和第二个字母都是大写的情况下,那么bean名称就是原类名.
@Service
启动类中代码:
//1.获取 srping 容器
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2.获取 bean 对象
//获取对象时使用类名的小驼峰形式作为 name 参数
UserService userService = context.getBean("userService", UserService.class);
//3.使用 bean
userService.sayHi();
UserService
类:
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 项目的标准分层如下:
- 控制层(Controller)
- 服务层(Service)
- 数据持久层(Dao)
而五大类注解便是对应着不同的层级别使用的,让程序猿看到某一个注解就可以明确这个了类是做什么的。 程序的⼯程分层,调⽤流程如下:
包括企业中也是按照这样的结构来将项目分层的,典型的比如阿里,它只是在标准分层在服务层(Service)做了一个扩展,划分的更加细致详细了.
五大类注解主要起到的是“见名知意”的作用,代码层面上来看,作用是类似的.查看五大类源码可知:
五大类的源码中除了 @Component
以外,其他四大类注解中都包含了 @Component 注解的功能,这四大类注解都是基于 @Component 实现的,是 @Component 拓展。
2.3 有关获取Bean参数的命名规则
上文中在使用依赖查找的方式获取Bean
时,我们讲到了getBean
方法的BeanName
是使用类名的小驼峰形式(即类名的首字母小写)以及第一个字母和第二个字母都大写情况下的特例.
注意:BeanName的规范命名规则并不是 Spring 独创的,而依照 Java 标准库的规则进行的。
BeanName的规范命名规则:
- 如果类名不存在或类名为空字符串,
BeanName
为原类名。 - 如果类名字长度大于1,且第一个与第二个字符为大写,
BeanName
为原类名。 - 其他情况,
BeanName
为原类名的小驼峰形式.
3. 使用方法注解储存 Bean 对象
3.1 方法注解储存对象的用法
类注解是添加到某个类上的,而方法注解是放到某个方法上的.在Spring框架的设计中,方法注解@Bean
要配合类注解才能将对象正常存储到Spring容器中.
举个