Spring之路(7)--提高公司管理效率(使用注解快速定义bean)

简介: 本文目录1. 效率非常重要!2. xml效率很一般3. 为何用注解会比xml效率高?4. 注解与xml本质都是元数据5. 使用注解定义bean的实例5.1 创建包5.2 创建spring.xml配置文件5.3 通过注解定义bean5.4 开始运行5.5 验证工作,定义两个重复的bean

1. 效率非常重要!

公司要生存发展,必须提高生产效率;学生要提高学习成绩,需要提高学习效率;职场上的人员要发展事业,需要提高工作效率。


效率非常重要这一点,没有必要多说,效率要尽可能的高,这样才能在有限的生命中尽可能多的创造精彩。


2. 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中这三个词均只出现一次。


3. 为何用注解会比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,如果还不信的话可以去数一下两种方式相关的字符数。


4. 注解与xml本质都是元数据

虽然注解效率高,但是在定义bean这件事情上,与xml没啥区别。也就是效果相同,方式不同,都是定义bean。


实际上xml与注解,都是元数据,用来向spring容器提供配置信息的。


spring容器启动时,会扫描元数据,根据元数据配置的规则,生成bean对象放入容器。此处如果想知道具体如何实现的,需要去了解下反射技术,当然不去了解也OK,学以致用,目前阶段能理解,能用就OK了。


5. 使用注解定义bean的实例

扯了这么一大堆,还没有一个完整实例,那可不行啊,我个人的原则就是必须要有完整实例。


5.1 创建包

创建包org.maoge.annotationbean用于放置本实例所有代码和配置文件


5.2 创建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>


5.3 通过注解定义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;

}

}


5.4 开始运行

启动容器后,同样是从容器中获取指定名称的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();

}

}


5.5 验证工作,定义两个重复的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,也能运行。


其实也能理解,就跟世界上有两个身份证号一样的人,那地球也不能就因为不符合规则就不转了?


嗯,这是代码里面蕴含的世界观啊!

相关文章
|
15天前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
313 128
|
1月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
292 0
|
1月前
|
Java 测试技术 API
将 Spring 的 @Embedded 和 @Embeddable 注解与 JPA 结合使用的指南
Spring的@Embedded和@Embeddable注解简化了JPA中复杂对象的管理,允许将对象直接嵌入实体,减少冗余表与连接操作,提升数据库设计效率。本文详解其用法、优势及适用场景。
221 126
|
2月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
17天前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
132 12
|
1月前
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
115 1
使用Spring的@Retryable注解进行自动重试
|
1月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
探索Spring Boot的@Conditional注解的上下文配置
|
1月前
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
Spring中最大化@Lazy注解,实现资源高效利用
|
1月前
|
安全 IDE Java
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
本文介绍了如何在 Spring 应用程序中使用 Project Lombok 的 `@Data` 和 `@FieldDefaults` 注解来减少样板代码,提升代码可读性和可维护性,并探讨了其适用场景与限制。
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码