在使用Spring框架的时候我们如果使用这种方式来存储bean对象的话未免有点太麻烦了
<bean id="xxx" class="xxx"> </bean>
为了简化存储Bean对象的操作,我们可以使用五大类注解来进行存储Bean对象
我们首先要在配置文件配置扫描路径,需要主要的是,只有在扫描路径里面的类添加了五大类注解才可以被添加到Spring容器中,否则即使添加了五大类注解也能被添加到Spring容器中
<content:component-scan base-package="xxxx"> </content:component-scan>
在这里我举了一个例子,大家看一看
这里我没有把Controller这个包配置到扫描路径下,所以即使我添加了五大类注解也不会被添加到Spring容器中!
那么这么做的目的究竟是为什么呢?答案很简单!是为了保证Spring框架的性能
假如不需要扫描路径,直接将添加五大类注解,那么Spring一定会扫描所有的包底下所有的类,那么这么做一定会消耗大量的资源和时间,使得Spring的性能变差。假如我们使用了扫描路径,那么Spring就只需要扫描该包底下的所有类,查看哪些类添加了五大类注解,并将它们添加到Spring容器中。
如果使用了五大类注解将Bean对象存储到Spring容器中,那么应该怎样取出来呢?
我们知道如果将Bean存储到Spring容器中,那么就一定需要给Bean取一个id,方便标识
我们查询源码可以发现,那么使用五大类注解后,id的命名规则就有两种了
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);}
如果该类的名字第一个字母是大写第二个字母是小写的话,那么存储到Spring的Bean的id与该类的名字一致的同时将第一个字母修改成小写
类名:StudentController -----> Bean的id:studentController
如果该类的名字第一个字母是大写第二个字母是大写的话,那么存储到Spring的Bean的id与该类的名字一致
类名:SController -----> Bean的id:SController
当我们看看五大类注解的源码的时候,我们会发现其实除了@Component以外的四个类都是实现了@Component注解的,换言之其实他们五大类注解都只是一个注解!
那么为什么还需要分五大类注解呢?想要知道这个问题的答案,我们首先需要知道一个概念叫做Spring分层架构!
Controller层相当于是一个“保安”,与前端打交道,用来检验前端传过来的数据是否符合规范
Service层相当于是“服务中心”,将服务进行调度,告诉各个数据应该“去哪”
DAO层则是直接与数据库打交道的,操纵数据库,对数据进行持久化存储
@Controller表示逻辑业务层
@Service表示服务层
@Reposity表示持久层
@Configuration表示配置层
@Compoent表示工具层
所以五大类注解的作用就是为了让程序更好的区分各个类的作用是什么!