前言:
今天我们依然是学习Spring,这里我们会更加了解Spring的知识,知道Spring是怎么更加简单的读取和存储Bean对象的。也会让大家对Spring更加了解。
前路漫漫,希望大家坚持下去,不忘初心,成为一名优秀的程序员
个人主页⭐: 书生♡
gitee主页♂:奋斗的小白
博客领域:java编程 ,前端,算法,强训题目
写作风格:超前知识点,干货,思路讲解,通俗易懂
支持博主:关注⭐,点赞、收藏⭐、留言
上一篇文章,已经教会大家怎么去存储Bean对象了,但是会发现比较麻烦,所以这篇文章会教会大家怎么更加简单的去存储Bean对象。
在 Spring 中想要更简单的存储和读取对象的核⼼是使⽤注解,也就是我们接下来要学习 Spring 中的相 关注解,来存储和读取 Bean对象。
在上一篇文章中,我们存储 Bean 时,需要在 spring-config 中添加⼀⾏ bean 注册内容才⾏。
但是会发现当我们需要注入多个类的时候,就会添加很多的Bean标签,会很麻烦,那有什么可以解决吗?
我们可以使用一行代码就去解决这个问题。
在我们的spring-config.xml中添加一行代码。
再添加这个代码的时候需要注意:一定要配置包路径,就是上图的标注的位置。
我们需要配置⼀下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中。
就是说你要扫描的对象,在哪个包下面,你就把这个包的路径写上去。
<?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="Spring.demo"></content:component-scan>
</beans>
有人就会问了,我不用包行不行,直接在根目录下创建一个类,是可以的,那么我们就需要这个位置不用写包的路径,写上两个**,就可以了,这个就代码扫描全部的。但是不建议这样写,因为我们以后再公司的时候,一定会有这样的路径的,所以建议大家在这里还是写在包的下面,更规范些。
我们通过注解来存储对象在Spring中,有两种方式:
1.类注解:@Controller、@Service、@Repository、@Component、@Configuration。
2.方法注解:@Bean
下面为大家分别讲讲这两种方式。
我们知道存储Bean对象有五种类注解。
@Controller 控制器
@Service 服务
@Repository 仓库
@Component 组件
@Configuration 配置
下面为大家分开说说这五种类注解。(重点是前三个)
我们在使用类注解的时候,类注解全部都是在类的上面的,因为我们是想将对象存储到 Spring 中,整个类就是一个对象,所以在类的上面。
使⽤ @Controller 存储 bean 的代码展示:
@Controller//将对象存储到 Spring 中
public class ApplicController {
public String hello()
{
return "Hello Spring !!!!";
}
}
public static void main(String[] args) {
//1.获取Spring对象(上下文)
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
//2.取出bean对象
//(3)根据Bean名称(标识)+类型 来得到Bean
ApplicController applicController =context.getBean("applicController", ApplicController.class);
//3.使用bean
System.out.println(applicController.hello());
}
这个和上面的一样,在类上面添加一个注解,@Service
使⽤ @Service 存储 bean 的代码展示:
@Service
public class ApplicController {
public String hello()
{
return "Hello Spring !!!!";
}
}
这个和上面的一样,在类上面添加一个注解,@Repository
使⽤ @Repository存储 bean 的代码展示:
@Repository
public class ApplicController {
public String hello()
{
return "Hello Spring !!!!";
}
}
这个和上面的一样,在类上面添加一个注解,@Component(这个用的比上面三个会少一些)
使⽤ @Component存储 bean 的代码展示:
@Component
public class ApplicController {
public String hello()
{
return "Hello Spring !!!!";
}
}
其他的代码和上面的一样就不写了。这个也是可以运行成功的。
这个和上面的一样,在类上面添加一个注解,@Configuration(这个使用会更少一点)
使⽤ @Configuration存储 bean 的代码展示:
@Configuration
public class ApplicController {
public String hello()
{
return "Hello Spring !!!!";
}
}
其他的代码和上面的一样就不写了。这个也是可以运行成功的。
类注解是添加到某个类上的,⽽⽅法注解是放到某个⽅法上的。
那么为什么要引入方法呢?
1:因为一个类中可能会有很多个方法,但是我并不全部都需要引入到Spring,如果使用类注解,那么就是将整个类注入Spring中,耽误性能,所以使用方法注解,需要哪个方法就将那个方法注入
2.如果一个类中出现了两个同样的方法,那么实用类注解的时候,不知道去取一个,那么就需要使用方法注解的name属性去区分了。
@Controller
public class StudentBeans {
@Bean
public Student student1() {
// 伪代码,构建对象
Student stu = new Student();
stu.setId(1);
stu.setName("张三");
stu.setAge(18);
return stu;
}
}
注意:
在 Spring 框架的设计中,⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中
如果单独使用方法注解,会报错的
我们可以通过设置 name 属性给 Bean 对象进⾏重命名操作
格式为:
@Bean({“名称”})
这个重命名的 name 其实是⼀个数组,⼀个 bean 可以有多个名字,每一个名称用双引号括起来,用逗号分开。
注意事项:
当给@Bean设置了name属性之后,使用原方法名就不能获取到对象了,只能使用设置的名称才能获取。
@Controller
public class StudentBeans {
@Bean
public Student student1() {
// 伪代码,构建对象
Student stu = new Student();
stu.setId(1);
stu.setName("张三");
stu.setAge(18);
return stu;
}
@Bean({"s1","s2"})
public Student student2() {
// 伪代码,构建对象
Student stu = new Student();
stu.setId(2);
stu.setName("李四");
stu.setAge(20);
return stu;
}
}
//另外一个启动类中
public static void main(String[] args) {
//1.获取Spring对象(上下文)
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
//2.取出bean对象
Student student =context.getBean("student1",Student.class);
System.out.println(student);
System.out.println("===========");
Student stu =context.getBean("s1",Student.class);
System.out.println(stu);
System.out.println("===========");
//Student stu1 =context.getBean("student2",Student.class);//这种是错误的
//System.out.println(stu1);
}
我们在spring-config.xml中引入了,这么一段代码,我们就可以不使用bean标签了,但是我们会发现没有了id这个属性了,那我们在获取Bean对象的时候怎么办,如果只使用类名的话就会出现问题。
其实当我们类名首字母是大写的是,默认将类名的首字母小写,就是我们的id标识了。
这个时候我们就会有几个疑问:
问题1.如果类名首字母是小写,要怎么从Spring中获取Bean?
答:和首字母是大写是一直的,都是用的是将类名首字母小写的方式来获取对象。
问题2:如果首字母和第二字母都是大写,会怎样?
答:当使用默认规则,首字母小写获取Bean对象时,失败了!
正确获取Bean的方式是使用原类名,就能成功获取到了。
问题3:项目中没有目录,所有的类都写在 java根路径下,怎么存、取 Bean对象?
答:我们只需要改一下配置文件的包路径就行,将路径改为**
1.通过类注解可以了解当前类的用途(就好像看到一个东西就知道这是哪里的,具有很强的识别性)
2.功能有细微不同:这个在 Spring MVC/Spring Boot再详细展开。
1.@Controller(控制器)∶归属于业务逻辑层,用来控制用户的行为,它用来检查用户参数的有效性。
2.@Service(服务):归属于服务层,调用类实现相应的功能。【不直接和数据库交互的,它类似于控制中心】
3.@Repository(仓库):归属于持久层,是直接和数据库进行交互的。通常每一个表都会对应一个@Repository。
4.@Configuration(配置)∶归属于配置层,是用来配置当前项目的一些信息。
5. @Component(组件):归属于公共工具类,提供某些公共方法。
先来看一下这五个类注解的源代码,可以发现每一个类注解都有一个@Componen,
这个就表明@Componen是他们的父类