上篇文章介绍了Spring的创建和使用,讲解3了Bean对象的基本存储和取出,这篇文章我们将会介绍Spring更简单的对象存储
目录
- 1.Bean的存储
- 1.0准备工作
- 1.1五大类注解
- 1.1.2为什么要有这么多注解
- 1.2方法注解
- 1.1.1方法注解需要搭配类注解一起使用
- 1.2.2方法重载怎么办
- 小结
1.Bean的存储
原先Bean的存储,是先通过在xml的配置文件内增加bean标签,Spring再根据标签内容进行存储。
这种方法有个缺点就是如果我们要存储多个对象,效率就会很低,因为你要注册多个bean标签。如何更简单的注册多个对象呢?我们可以采用添加注解的方式来解决。
1.0准备工作
想要用到注解,我们必须先配置一下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="com.bit.service"></content:component-scan>
</beans>
这里唯一需要修改的点就是:
注意base-package的内容,这里填写的就是你想注册到Spring对象所在的包名。你填com.bit.service,存储对象是就会存储service中所有类对应的对象,当然如果sevice底下还有包,里面的内容也会被存储。
如果你想存储java文件(文件目录蓝色的那个java)下所有的类对应的对象,就填**,不过**效率太低,不推荐。
1.1五大类注解
五大类注解:
@Controller(控制器存储)
@Service(服务存储)
@Repository(仓库存储)
@Component(组件存储)
@Configuration(配置存储)
这五个注解的使用方式都一样,最大区别就是它们的含义,这里先说使用,一注解@Controller为例
首先,我们创建两个类,一个类App负责执行main方法,另一个ControllerUser用于存入Spring
@Controller
public class ControllerUser {
public void fun(){
System.out.println("我是ControllerUser的fun方法");
}
}
那么main函数里面的代码和之前取对象的代码一样,先获取Spring上下文对象,再调用它的getBean方法。不过有一个,我们getBean的参数怎么填?因为我们这里是没有id的,看了上一篇文章了同学,就会想到,可以通过类对象的方法来解决:
ControllerUser controllerUser =context.getBean(ControllerUser.class);
这样是可以获取到我们的对象的,如果想通过传入字符串的方式获取,当然也有方法。可以根据Spring的内置的约定来获取。约定源码:
阅读完源码,可以得到约定:
Spring约定不同的类名定义风格对应不同的参数:
1.ClassName 首字母小写
2.className 首字母小写
3.CName 使用原类名
总结 除了类名是首字母和第二个字母均大写的情况使用原类名,其余全部为小写类名首字母即可。
————————————————————————
如果想查看源码的话,可采用以下操作:
1.
该类名翻译过来就是:注解对象名称生成器
2.找到generateBeanName方法,进入buildDefaultBeanName方法,再进入decapitalize方法即可。
1.1.2为什么要有这么多注解
既然使用方式都一样,相信大家都有一个疑问?为什么还要有五个注解呢,这不是多次四举吗。
那么为什么要有这么多,我们得对着项目来考虑。对于一个项目,分为很多部分:有用户输入信息部分,有根据输入信息执行不同动作的部分,有专门访问数据库的部分等等,这么多注解就是为了帮助我们进行分类,如果所有的类都使用一种注解,就降低了代码的易读性。
那么这些注解都有哪些含义呢?
@Controller:表示的是业务逻辑层;
@Servie:服务层;
@Repository:持久层;
@Configuration:配置层
• 业务逻辑层主要针对用户输入等等
• 服务层是根据不同的输入调用不同的访问数据库的方法等等,它不直接访问数据库
• 持久层有点抽象,持久化存储就是数据库,它主要负责访问不同的数据库
• 配置层 程序的各种配置
用图来表示:
这里没有提到@Component(组件存储),却又处处存在@Component,因为这四个注解都是@Component的子类,翻阅源码就可以看到了。
1.2方法注解
1.1.1方法注解需要搭配类注解一起使用
@Bean
这个注解是将修饰方法的返回值对象注册到Spring中
我们创建三个类:
User被存储,BeanUser包含一个返回User对象的方法,App执行main函数。
public class User {
public int id;
public User(int id) {
this.id = id;
}
public void fun(){
System.out.println("我是User的fun方法");
}
}
public class BeanUser {
@Bean
public User getUser(){
return new User(99);
}
}
public class App {
public static void main(String[] args) {
ApplicationContext context=
new ClassPathXmlApplicationContext("spring-config.xml");
User user=(User) context.getBean("");
System.out.println(user.id);
}
这里依然是不知道,getBean的参数,这里的话就不买关子,这里的默认参数是被注解的方法名,这里就是getUser。我们执行一下:
结果报错了,这是这么回事呢?查看自己的参数没问题啊,说明取是没问题的,那么肯定就是存出了问题。
使用方法注解需要搭配类注解一起使用也就是BeanUser需要添加类注解,这是为什么呢?
因为方法注解是在类里面的,Spring扫描我们的包时,先考虑有类注解的类,再在它的基础上看有没有方法注解的方法,这样是为了提高效率,不然一个类那么多方法要扫描到什么时候。
那么我们来加上类注解::
结果正确!
1.2.2方法重载怎么办
我们知道,给方法添加注解很大的问题就是方法重名怎么办?我们的getBean参数又怎么填呢?那么可以通过重命名的方式来处理:
名称可以有多个,但是一旦使用重命名,之前的方法名获取就会失效。
缩写:@Bean({"n1","n2"})
小结
这篇文章主要介绍更简单的Bean对象的存储,下一篇会介绍更简单的对象取出,喜欢的话还请多多关注点赞!