Spring之路(7)--提高公司管理效率(使用注解快速定义bean)
2020/1/24 17:53:00
本文主要是介绍Spring之路(7)--提高公司管理效率(使用注解快速定义bean),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
效率非常重要!
公司要生存发展,必须提高生产效率;学生要提高学习成绩,需要提高学习效率;职场上的人员要发展事业,需要提高工作效率。
效率非常重要这一点,没有必要多说,效率要尽可能的高,这样才能在有限的生命中尽可能多的创造精彩。
xml效率很一般
xml这种数据格式本身效率就比较一般,先不说在定义bean这个方面,就是传输数据上,效率也不如常用的json,例如我们要传递一个学生的信息,xml如下:
<?xml version="1.0" encoding="UTF-8"?> <student> <name>zhangsan</name> <age>20</age> </student>
json如下:
{ "student": { "name": "zhangsan", "age": 20 } }
我们仅计算有效的内容部分(忽略xml头部),xml文件中有53个字符,json文件中有40个字符。
那么为何效率低呢,举个简单的例子,xml需要开闭两个标签,例如student、name、age都出现了两次,而json中这三个词均只出现一次。
为何用注解会比xml效率高?
此处首先要深入的理解场景,我们在spring框架中使用xml,主要就是为了定义bean,而bean实际上是类的对象。
所以当我们使用xml定义bean时,我们首先就要先指定bean所属的类,然后再给bean命名、设置bean属性等一系列具体定义,如下:
<bean id="zhoujielun" class="org.maoge.xmlbeandetail.Singer"> <property name="name" value="周杰伦"></property> </bean>
- 先告诉spring容器,此处定义的bean的类型是
class="org.maoge.xmlbeandetail.Singer"
- 然后告诉容器,bean的唯一名称是
id="zhoujielun"
- 再告诉容器,bean的属性设置为
<property name="name" value="周杰伦"></property>
如果使用注解,spring将扫描类上注解(而不是扫描xml)来寻找bean的定义,这一点实际上没有提高效率,但是由于注解天生的就附着到类定义上,所以根本就不需要再指定bean所属的类了,如下:
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component("zhoujielun") public class Singer { @Value("周杰伦") private String name; public void sing() { System.out.println("歌手[" + name + "]开唱啦,快挥舞起你手中的荧光棒吧"); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
- 告诉spring容器,bean的唯一名称是zhoujielun(类型毫无疑问是Singer)。注意
@Component
注解的作用就是告知Spring,为Singer类生成一个bean放入容器。 - 为name属性注入值
"周杰伦"
。
可以发现,使用注解的方式,效率是高于xml,如果还不信的话可以去数一下两种方式相关的字符数。
注解与xml本质都是元数据
虽然注解效率高,但是在定义bean这件事情上,与xml没啥区别。也就是效果相同,方式不同,都是定义bean。
实际上xml与注解,都是元数据,用来向spring容器提供配置信息的。
spring容器启动时,会扫描元数据,根据元数据配置的规则,生成bean对象放入容器。此处如果想知道具体如何实现的,需要去了解下反射技术,当然不去了解也OK,学以致用,目前阶段能理解,能用就OK了。
使用注解定义bean的实例
扯了这么一大堆,还没有一个完整实例,那可不行啊,我个人的原则就是必须要有完整实例。
step1 创建包
创建包org.maoge.annotationbean
用于放置本实例所有代码和配置文件
step2 创建spring.xml配置文件
注意此时还是需要xml配置文件的,但是并不需要从里面定义bean,而是开启bean扫描。如下所示,context:component-scan
的作用是扫描org.maoge.annotationbean
包中的类,发现被注解的类就为其创建相应的bean。
<?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:context="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 http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <context:component-scan base-package="org.maoge.annotationbean" /> </beans>
step3 通过注解定义bean
这一步上面说的比较详细了,此处不再赘述。
package org.maoge.annotationbean; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component("zhoujielun") public class Singer { @Value("周杰伦") private String name; public void sing() { System.out.println("歌手[" + name + "]开唱啦,快挥舞起你手中的荧光棒吧"); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
step4 开始运行
启动容器后,同样是从容器中获取指定名称的bean,调用其方法,大家会发现效果如同xml定义bean。
package org.maoge.annotationbean; import org.springframework.context.support.ClassPathXmlApplicationContext; public class AnnotationContainerDemo { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "/org/maoge/annotationbean/spring.xml"); Singer zhoujielun = (Singer) context.getBean("zhoujielun"); zhoujielun.sing(); } }
step5 验证工作,定义两个重复的bean
如果此时再次在xml中配置一个同样id的bean如下:
<?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:context="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 http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <context:component-scan base-package="org.maoge.annotationbean" /> <bean id="zhoujielun" class="org.maoge.annotationbean.Singer"> <property name="name" value="周杰伦"></property> </bean> </beans>
运行程序可见控制台提示:
信息: Overriding bean definition for bean 'zhoujielun' with a different definition: replacing [Generic bean: class [org.maoge.annotationbean.Singer]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\work\EclipseWork\SpringJavaProjectDemo\bin\org\maoge\annotationbean\Singer.class]] with [Generic bean: class [org.maoge.annotationbean.Singer]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [org/maoge/annotationbean/spring.xml]] 歌手[周杰伦]开唱啦,快挥舞起你手中的荧光棒吧
大体意思是覆盖了一个zhoujielun的定义,反正就是重复定义了,不过spring框架也是挺有意思,两个身份证号相同的bean,也能运行。
其实也能理解,就跟世界上有两个身份证号一样的人,那地球也不能就因为不符合规则就不转了?
嗯,这是代码里面蕴含的世界观啊!
这篇关于Spring之路(7)--提高公司管理效率(使用注解快速定义bean)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?
- 2024-05-09企业src漏洞挖掘-有意思的命令执行
- 2024-05-08阿里云域名注册流程,分享给第一次购买域名的新手站长!