【Java】Spring更简单的读取和存储
创始人
2024-05-26 16:56:32
0

文章目录

  • Spring更简单的读取和存储对象
    • 1. 存储Bean对象
      • 1.1 前置工作:配置扫描路径
      • 1.2 添加注解存储Bean对象
        • 1.2.1 @Controller(控制器存储)
        • 1.2.2 @Service(服务存储)
        • 1.2.3 @Repository(仓库存储)
        • 1.2.4 @Component(组件存储)
        • 1.2.5 @Configuration
      • 1.3 为什么要这么多类注解
        • 1.3.1 类注解之间的关系
        • 1.3.2 Bean命名规则
      • 1.4 方法注解
        • 1.4.1 方法注解要配合类注解来使用
        • 1.4.2 重命名Bean
    • 2. 获取Bean对象(对象装配)
      • 2.1 属性注入
      • 2.2 构造方法注入
      • 2.3 Setter注入
      • 2.4 三种注入的优缺点
      • 2.5 @Resource:另一种注入关键字
      • 2.6 同一个类型多个@Bean报错
    • 3. 总结

Spring更简单的读取和存储对象

我们现在已经可以实现基本的Spring读取和存储对象的操作了,但在操作过程当中。我们发现并没有那么简单。在Spring当中想要更简单的存储和使用对象的核心是使用注解接下了就了解下,如何使用注解来存储和获取Bean

1. 存储Bean对象

之前存储Bean对象,需要添加一行bean才能注册,如下图所示:

在这里插入图片描述

而现在只需要一个注解,就可以代替一行的配置,但是我们先要来点准备工作

1.1 前置工作:配置扫描路径

注意:想要把Bean成功的存储到Spring当中,我们需要配置一下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确识别并保存到Spring当中

spring-config.xml当中添加如下配置:




在这里插入图片描述

圈起来的是扫描路径,表示所有要存放到Spring中的Bean的根目录

1.2 添加注解存储Bean对象

想要将对象存储到Spring当中,有两种注解类型可以实现:

  1. 类注解:@Controller @Service @Repository @Component @Configuration
  2. 方法注解:@Bean

接下来,分别来看:

1.2.1 @Controller(控制器存储)

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

这时我们按照之前的方法获取到Spring中的Bean

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
UserController userController = context.getBean("userController", UserController.class);
userController.sayHi();

1.2.2 @Service(服务存储)

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

1.2.3 @Repository(仓库存储)

@Repository
public class UserRepository {public void sayHi() {System.out.println("你好Repository");}
}

1.2.4 @Component(组件存储)

@Component
public class UserComponent {public void sayHi() {System.out.println("你好Component");}
}

1.2.5 @Configuration

@Configuration
public class UserConfiguration {public void sayHi() {System.out.println("你好Configuration");}
}

1.3 为什么要这么多类注解

既然功能都是一样的,为什么需要这么多呢?

这和为什么每个省/市都有自己的车牌号是一样的?比如陕西车牌号就是:陕XXXXXX,北京车牌号是:京XXXXXXXX。甚至一个省不同的县区车牌号都是不一样的。这样做的好处就是节约了号码,更重要的是可以直观的标识一辆车的归属地

那么为什么需要这么多类的注解也是相同的原因,就是让程序员看到类注解之后,就直接了解当前类的用途。

让代码的可读性提高,让程序员能够直观的判断当前类的用途

比如:

  • @Controller表示业务逻辑层
  • @Service表示服务层
  • @Repository表示持久层
  • @Configuration表示配置层

程序的工程分层,调用流程如下:

在这里插入图片描述

1.3.1 类注解之间的关系

查看@Controller、@Service、@Repository、@Configuration等注解可以发现:在这里插入图片描述

这些类注解里面都有一个注解@Component,说明它们本身就属于@Component的“子类”

1.3.2 Bean命名规则

通过场面的例子我们可以看出,通常我们bean使用的都是标准大驼峰的命名,而读取的时候首字母小写就可以获取到bean了。

然后当我们首字母和第二个字母都大写的时候,就不能正常的读取到Bean了

这个时候我们就要查询Spring关于Bean存储时生成的命名规则了在这里插入图片描述

源码如下:

public static String decapitalize(String name) {if (name == null || name.length() == 0) {return name;}if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&Character.isUpperCase(name.charAt(0))){return name;}char chars[] = name.toCharArray();chars[0] = Character.toLowerCase(chars[0]);return new String(chars);
}

1.4 方法注解

类注解是添加到某个类上的,而方法注解是放到某个方法当中,如以下代码实现:

public class UserBean {@Beanpublic void sayHi() {System.out.println("你好bean");}
}

但是我们发现根本获取不到。这是为什么?

1.4.1 方法注解要配合类注解来使用

在Spring框架当中,方法注解@Bean要配合类注解才能将对象正常的存储到Spring容器当中,如下代码:

@Component
public class UserBean {@Beanpublic User getUser() {User user = new User();user.setId(1);user.setName("张三");return user;}
}

1.4.2 重命名Bean

可以通过设置name属性给Bean对象进行重命名操作

@Component
public class UserBean {@Bean(name = "user")public User getUser() {User user = new User();user.setId(1);user.setName("张三");return user;}
}

Bean命名规则:当没有设置name属性的时候,那么bean默认的名称就是方法名,当设置了name属性之后,只能通过重命名的那么属性对应的值来获取。也就是说,重命名之后再使用方法名就获取不到了

2. 获取Bean对象(对象装配)

获取bean对象也叫对象装配,是把对象取出来放到某个类当中,也时候也叫作对象注入

对象装配的实现有以下3中方法:

  1. 属性注入
  2. 构造方法注入
  3. Setter注入

2.1 属性注入

在这里插入图片描述

2.2 构造方法注入

在这里插入图片描述

如果当前类当中只存在一个构造方法,那么@Autowired注解可以省略

2.3 Setter注入

在这里插入图片描述

2.4 三种注入的优缺点

  • 属性输入的优点是简介、使用方便;缺点是只能用于IOC容器,如果不是IOC容器不可用,并且只有在使用的时候才会出现NPE(空指针异常)
  • 构造方法注入是Spring推荐的注入方式。它的缺点是如果有多个注入会显得比较臃肿,但是出现这种情况应该考虑一下当前类是否符合程序的单一职责的设计模式了,它的有点在于通用性,在使用之前,一定能保证注入的类不为空
  • Setter方式是Spring前期版本推荐的注入方式,但是通用性不如构造方法,所有Spring版本已经推荐使用构造方法来注入了

2.5 @Resource:另一种注入关键字

@Autowired和@Resource的区别:

  • 出身不同:@Autowired 来自于Spring,而@Resource来自于JDK的注解
  • 使用时设置的参数不同:@Resource支持更多的参数设置,例如name设置,根据名称获取Bean
  • @Autowired可用于Setter注入、够着函数注入、属性注入,而@Resource只能用于Setter和属性注入,不用用于构造函数注入

2.6 同一个类型多个@Bean报错

解决方案有以下两种:

  • 使用@Resource(name=“user1”)定义
  • 使用@Qualifier注解定义名称
@Controller
public class UserController5 {// 注⼊@Autowired@Qualifier(value = "user2")private User user;public User getUser() {return user;}
}

3. 总结

  1. 将对象存储到Spring中:
    1. 使用类注解:@Controller、@Service、@Repository、@Configuration、@Component【它们之间的关系】
    2. 使用方法注解:@Bean【注意事项:必须配合类注解一起使用】
  2. Bean的命名规则:首字母和第二个字母都不是大写,首字母小写来获取Bean,如果首字母和第二个字母都是大写,那么直接使用Bean名来获取Bean
  3. 从Spring中获取对象
    1. 属性注入
    2. Setter注入
    3. 构造方法注入(推荐)
  4. 注入的关键字有
    1. @Autowired
    2. @Resource
  5. @Autowired 和 @Resource 区别:出身不同;使用是设置参数不同@Resource支持更多的参数设置
  6. 解决同一个类型多个Bean的报错
    1. 使用@Resource(name = “”)
    2. 使用@Qualifier(“”)

相关内容

热门资讯

安卓子系统windows11,... 你知道吗?最近科技圈可是炸开了锅,因为安卓子系统在Windows 11上的兼容性成了大家热议的话题。...
电脑里怎么下载安卓系统,电脑端... 你有没有想过,你的电脑里也能装上安卓系统呢?没错,就是那个让你手机不离手的安卓!今天,就让我来带你一...
索尼相机魔改安卓系统,魔改系统... 你知道吗?最近在摄影圈里掀起了一股热潮,那就是索尼相机魔改安卓系统。这可不是一般的改装,而是让这些专...
安卓系统哪家的最流畅,安卓系统... 你有没有想过,为什么你的手机有时候像蜗牛一样慢吞吞的,而别人的手机却能像风一样快?这背后,其实就是安...
安卓最新系统4.42,深度解析... 你有没有发现,你的安卓手机最近是不是有点儿不一样了?没错,就是那个一直在默默更新的安卓最新系统4.4...
android和安卓什么系统最... 你有没有想过,你的安卓手机到底是用的是什么系统呢?是不是有时候觉得手机卡顿,运行缓慢,其实跟这个系统...
平板装安卓xp系统好,探索复古... 你有没有想过,把安卓系统装到平板上,再配上XP系统,这会是怎样一番景象呢?想象一边享受着安卓的便捷,...
投影仪装安卓系统,开启智能投影... 你有没有想过,家里的老式投影仪也能焕发第二春呢?没错,就是那个曾经陪你熬夜看电影的“老伙计”,现在它...
安卓系统无线车载carplay... 你有没有想过,开车的时候也能享受到苹果设备的便利呢?没错,就是那个让你在日常生活中离不开的iOS系统...
谷歌安卓8系统包,系统包解析与... 你有没有发现,手机更新换代的速度简直就像坐上了火箭呢?这不,最近谷歌又发布了安卓8系统包,听说这个新...
微软平板下软件安卓系统,开启全... 你有没有想过,在微软平板上也能畅享安卓系统的乐趣呢?没错,这就是今天我要跟你分享的神奇故事。想象你手...
coloros是基于安卓系统吗... 你有没有想过,手机里的那个色彩斑斓的界面,背后其实有着一个有趣的故事呢?没错,我要说的就是Color...
安卓神盾系统应用市场,一站式智... 你有没有发现,手机里的安卓神盾系统应用市场最近可是火得一塌糊涂啊!这不,我就来给你好好扒一扒,看看这...
黑莓平板安卓系统升级,解锁无限... 亲爱的读者们,你是否还记得那个曾经风靡一时的黑莓手机?那个标志性的全键盘,那个独特的黑莓体验,如今它...
安卓文件系统采用华为,探索高效... 你知道吗?最近安卓系统在文件管理上可是有了大动作呢!华为这个科技巨头,竟然悄悄地给安卓文件系统来了个...
深度系统能用安卓app,探索智... 你知道吗?现在科技的发展真是让人惊叹不已!今天,我要给你揭秘一个超级酷炫的话题——深度系统能用安卓a...
安卓系统的分区类型,深度解析存... 你有没有发现,你的安卓手机里藏着不少秘密?没错,就是那些神秘的分区类型。今天,就让我带你一探究竟,揭...
安卓系统铠无法兑换,揭秘无法兑... 最近是不是有很多小伙伴在玩安卓系统的游戏,突然发现了一个让人头疼的问题——铠无法兑换!别急,今天就来...
汽车安卓系统崩溃怎么刷,一键刷... 亲爱的车主朋友们,你是否曾遇到过汽车安卓系统崩溃的尴尬时刻?手机系统崩溃还能重启,但汽车系统崩溃了,...
miui系统可以刷安卓p系统吗... 亲爱的手机控们,你是否对MIUI系统情有独钟,同时又对安卓P系统的新鲜功能垂涎欲滴?今天,就让我带你...