Spring 框架容器管理注解和生命周期

Spring 注解

在 Spring 框架中,大量的注解是由 Spring 容器(而不是虚拟机)进行处理和解析的。Spring 框架使用了反射和自定义的处理机制来解析注解,并根据注解的定义执行相应的逻辑。

Spring 框架中的注解主要用于配置和控制应用程序的行为,例如声明 Bean、依赖注入、AOP 等。以下是一些常用的 Spring 注解及其作用:

  • @Component:用于标记一个类为 Spring 组件,会被 Spring 自动扫描并创建实例。
  • @Autowired:用于自动注入依赖对象。
  • @RequestMapping:用于映射 HTTP 请求到处理方法。
  • @Transactional:用于声明事务管理。
  • @Aspect@Before@After 等:用于声明切面和切点,实现 AOP 功能。

当使用了这些注解时,Spring 容器会在应用程序启动时扫描所配置的包,并解析这些注解。它会通过反射机制获取注解信息,并根据注解的定义执行相应的逻辑,例如创建 Bean 实例、自动注入依赖、生成代理对象等。

Spring 框架还提供了一些工具类和接口,用于处理和解析注解,例如 AnnotationUtilsAnnotatedElementUtilsAnnotationConfigApplicationContext 等。这些工具和接口可以让开发人员更方便地处理和访问注解信息。

需要注意的是,虽然 Spring 框架在运行时使用了反射来处理注解,但这并不是虚拟机自动处理的。相反,Spring 框架提供了一套机制,用于解释和执行这些注解,并在应用程序运行时根据注解的定义来完成相应的功能。

Spring 容器

在 Spring 框架中,Spring 容器是一个负责创建、管理和组织应用程序中各个组件(Bean)的容器。它提供了一种便捷的方式来管理对象的生命周期、依赖注入和解析、AOP 等功能。

Spring 容器主要有两种类型:BeanFactory 和 ApplicationContext。

  1. BeanFactory:这是 Spring 容器的基本接口,定义了最简单的容器功能。它提供了对 Bean 的创建、获取、销毁等基本操作。示例代码如下:
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;public class MainApp {public static void main(String[] args) {BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));MyBean myBean = (MyBean) factory.getBean("myBean");myBean.doSomething();}
}
  1. ApplicationContext:这是 BeanFactory 接口的扩展,提供了更多的高级功能。它是 Spring 容器的完整实现,支持国际化、资源加载、事件发布等特性。示例代码如下:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");MyBean myBean = (MyBean) context.getBean("myBean");myBean.doSomething();}
}

在这两个示例中,spring-config.xml 是一个 XML 配置文件,用于定义 Bean 的配置和依赖关系。在实际应用中,可以使用不同的配置方式,如注解或 Java Config,来定义 Bean。

Spring 容器会读取配置文件并根据配置信息创建相应的 Bean 对象。通过调用容器的 getBean() 方法,可以获取到已经创建的 Bean 实例,并使用其提供的功能。

总结来说,Spring 容器是一个负责管理和组织应用程序中各个组件的容器,它可以根据配置信息创建、初始化和管理对象。通过使用 Spring 容器,可以实现依赖注入、AOP、事务管理等功能,使开发人员可以更加专注于业务逻辑的实现。

Spring 容器中 BeanFactory

public class BeanFactory implements ObjectFactory {private static final StringManager sm = StringManager.getManager(BeanFactory.class);private final Log log = LogFactory.getLog(BeanFactory.class); // Not static/*** Create a new Bean instance.** @param obj The reference object describing the Bean*/@Overridepublic Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?,?> environment)throws NamingException {if (obj instanceof ResourceRef) {try {Reference ref = (Reference) obj;String beanClassName = ref.getClassName();Class<?> beanClass = null;ClassLoader tcl = Thread.currentThread().getContextClassLoader();try {if (tcl != null) {beanClass = tcl.loadClass(beanClassName);} else {beanClass = Class.forName(beanClassName);}} catch(ClassNotFoundException cnfe) {NamingException ne = new NamingException(sm.getString("beanFactory.classNotFound", beanClassName));ne.initCause(cnfe);throw ne;}BeanInfo bi = Introspector.getBeanInfo(beanClass);PropertyDescriptor[] pda = bi.getPropertyDescriptors();Object bean = beanClass.getConstructor().newInstance();// Look for the removed forceString optionRefAddr ra = ref.get("forceString");if (ra != null) {log.warn(sm.getString("beanFactory.noForceString"));}Enumeration<RefAddr> e = ref.getAll();String value;while (e.hasMoreElements()) {ra = e.nextElement();String propName = ra.getType();if (propName.equals(Constants.FACTORY) ||propName.equals("scope") || propName.equals("auth") ||propName.equals("forceString") ||propName.equals("singleton")) {continue;}value = (String)ra.getContent();Object[] valueArray = new Object[1];int i = 0;for (i = 0; i < pda.length; i++) {if (pda[i].getName().equals(propName)) {Class<?> propType = pda[i].getPropertyType();Method setProp = pda[i].getWriteMethod();if (propType.equals(String.class)) {valueArray[0] = value;} else if (propType.equals(Character.class) || propType.equals(char.class)) {valueArray[0] = Character.valueOf(value.charAt(0));} else if (propType.equals(Byte.class) || propType.equals(byte.class)) {valueArray[0] = Byte.valueOf(value);} else if (propType.equals(Short.class) || propType.equals(short.class)) {valueArray[0] = Short.valueOf(value);} else if (propType.equals(Integer.class) || propType.equals(int.class)) {valueArray[0] = Integer.valueOf(value);} else if (propType.equals(Long.class) || propType.equals(long.class)) {valueArray[0] = Long.valueOf(value);} else if (propType.equals(Float.class) || propType.equals(float.class)) {valueArray[0] = Float.valueOf(value);} else if (propType.equals(Double.class) || propType.equals(double.class)) {valueArray[0] = Double.valueOf(value);} else if (propType.equals(Boolean.class) || propType.equals(boolean.class)) {valueArray[0] = Boolean.valueOf(value);} else if (setProp != null) {// This is a Tomcat specific extension and is not part of the// Java Bean specification.String setterName = setProp.getName();try {setProp = bean.getClass().getMethod(setterName, String.class);valueArray[0] = value;} catch (NoSuchMethodException nsme) {throw new NamingException(sm.getString("beanFactory.noStringConversion", propName, propType.getName()));}} else {throw new NamingException(sm.getString("beanFactory.noStringConversion", propName, propType.getName()));}if (setProp != null) {setProp.invoke(bean, valueArray);} else {throw new NamingException(sm.getString("beanFactory.readOnlyProperty", propName));}break;}}if (i == pda.length) {throw new NamingException(sm.getString("beanFactory.noSetMethod", propName));}}return bean;} catch (java.beans.IntrospectionException ie) {NamingException ne = new NamingException(ie.getMessage());ne.setRootCause(ie);throw ne;} catch (java.lang.ReflectiveOperationException e) {Throwable cause = e.getCause();if (cause instanceof ThreadDeath) {throw (ThreadDeath) cause;}if (cause instanceof VirtualMachineError) {throw (VirtualMachineError) cause;}NamingException ne = new NamingException(e.getMessage());ne.setRootCause(e);throw ne;}} else {return null;}}
}

Spring 中注解的处理机制

在 Spring 框架中,注解的处理机制是通过反射和基于注解的配置来实现的。Spring 可以通过扫描类路径或者指定的包路径,自动识别和处理注解,从而实现一些特定的功能。

以下是 Spring 中常见注解的处理机制:

  1. 组件扫描:Spring 提供了 @ComponentScan 注解用于指定要扫描的包路径,从而自动发现带有特定注解的类。在启动应用时,Spring 将扫描指定包路径下的所有类,并将带有 @Component 及其衍生注解(如 @Service@Repository@Controller)的类注册为 Bean。

  2. Bean 定义:通过注解可以方便地定义 Bean,例如 @Component@Service@Repository@Controller 等。这些注解告诉 Spring 在扫描到对应的类时将其注册为 Bean。

  3. 依赖注入:Spring 提供了 @Autowired 注解用于自动装配 Bean,它可以标记在字段、构造函数或方法上,Spring 将根据类型进行匹配并将依赖的 Bean 自动注入到对应的位置。

  4. 切面编程:通过注解可以方便地定义切面和通知,例如 @Aspect@Before@After@Around 等。这些注解可以让开发者在不修改原有业务代码的情况下,方便地实现横切关注点的功能。

  5. 事务管理:使用 @Transactional 注解可以简化事务的管理,通过在方法或类上添加该注解,在满足条件的情况下 Spring 将自动为方法添加事务支持。

总的来说,Spring 通过扫描注解并结合反射机制,实现了自动发现、自动装配和自动化配置功能,使得开发者可以更加方便地进行组件化开发和集成各种功能。同时,通过注解的方式可以减少 XML 配置文件的使用,使得配置更为简洁和易读。.

根据不同的注解生成不同的业务逻辑

通过在控制器类和请求处理方法上使用不同的注解,我们可以将不同的请求映射到不同的方法上,并实现相应的业务逻辑。在 Spring 框架中,这些注解会被扫描并识别,从而自动为我们生成相应的代码逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/192424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言之结构体

一.前言引入. 我们知道在C语言中有内置类型&#xff0c;如&#xff1a;整型&#xff0c;浮点型等。但是只有这些内置类 型还是不够的&#xff0c;假设我想描述学⽣&#xff0c;描述⼀本书&#xff0c;这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要名字、年龄、学号、⾝⾼、体…

Spark经典案例分享

Spark经典案例 链接操作案例二次排序案例 链接操作案例 案例需求 数据介绍 代码如下&#xff1a; package base.charpter7import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.spark.SparkContext import org.a…

四、Zookeeper节点类型

目录 1、临时节点 2、永久节点 Znode有两种,分别为临时节点和永久节点。 节点的类型在创建时即被确定,并且不能改变。 1、临时节点 临时节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,

OpenCV-Python:计算机视觉介绍

目录 1.背景 2.计算机视觉发展历史 3.计算机视觉主要任务 4.计算机视觉应用场景 5.知识笔记 1.背景 OpenCV是计算机视觉的一个框架&#xff0c;想要学习OpenCV&#xff0c;需要对计算机视觉有一个大致的了解。计算机视觉是指通过计算机技术和算法来模拟人类视觉系统的能力…

Redis高效缓存:加速应用性能的利器

目录 引言 1. Redis概述 1.1 什么是Redis&#xff1f; 1.2 Redis的特点 2. Redis在缓存中的应用 2.1 缓存的重要性 2.2 Redis作为缓存的优势 2.3 缓存使用场景 3. Redis在实时应用中的应用 3.1 实时数据处理的挑战 3.2 Redis的实时数据处理优势 3.3 实时应用中的Red…

整数转罗马数字算法(leetcode第12题)

题目描述&#xff1a; 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 50…

mediapipe+opencv实现保存图像中的人脸,抹去其他信息

mediapipeopencv MediaPipe本身不提供图像处理功能&#xff0c;它主要用于检测和跟踪人脸、手势、姿势等。如果您想要从图像中仅提取人脸主要信息并去除其他信息. # codingutf-8 """project: teatAuthor&#xff1a;念卿 刘file&#xff1a; test.pydate&…

Kubernetes学习笔记-Part.09 K8s集群构建

目录 Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退 第九章 K8s集群构建 9.1.集群初始化 集群初始化是首…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《余电上网/制氢方式下微电网系统全生命周期经济性评估》

该标题涉及到对微电网系统的全生命周期经济性进行评估&#xff0c;其重点关注两种运营方式&#xff1a;余电上网和制氢。以下是对标题的解读&#xff1a; 微电网系统&#xff1a; 微电网是指一种小规模的电力系统&#xff0c;通常包括分布式能源资源&#xff08;如太阳能、风能…

TS数据类型(全)

TS支持和JS几乎相同的数据类型&#xff0c;此外还提供了实用的枚举类型 总结&#xff1a;ts中变量一开始是什么类型&#xff0c;那么后期赋值的时候&#xff0c;只能用这个类型的数据&#xff0c;是不允许用其他类型的数据赋值给当前的这个变 量中。 数字类型&#xff08;numbe…

ES通过抽样agg聚合性能提升3-5倍

一直以来&#xff0c;es的agg聚合分析性能都比较差&#xff08;对应sql的 group by&#xff09;。特别是在超多数据中做聚合&#xff0c;在搜索的条件命中特别多结果的情况下&#xff0c;聚合分析会非常非常的慢。 一个聚合条件&#xff1a;聚合分析请求的时间 search time a…

DIV从不能移动变成随便定位(静态+编程)的方法

编了一个游戏测试小网页&#xff0c;竟然发现DIV不能随便移动&#xff0c;查了半天终于解决了静态和编程定位的问题。特别记录一下。 <div οnmοusedοwn"mDown(this)" οnmοuseup"mUp(this)" style"background-color: #D94A38; position: abso…

部署springboot项目到GKE(Google Kubernetes Engine)

GKE是 Google Cloud Platform 提供的托管 Kubernetes 服务&#xff0c;允许用户在 Google 的基础设施上部署、管理和扩展容器。本文介绍如何部署一个简单的springboot项目到GKE. 本文使用podman. 如果你用的是docker, 只需要把本文中所有命令中的podman替换成docker即可 非H…

LeetCode [中等]二叉树的右视图(层序

199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 从二叉树的层序遍历改进&#xff0c;根右左 /*** Definition for a binary tree node.* public class TreeNode {* public int val;* public TreeNode left;* public TreeNode right;* public T…

MiniDumpWriteDump函数生成dmp文件

MiniDumpWriteDump函数生成dmp文件 一&#xff1a;概述二&#xff1a; CreateDump.h三&#xff1a;CreateDump.cpp四&#xff1a;main测试五&#xff1a;winDbg分析 一&#xff1a;概述 v2008及以上版本都可以用。 包含CreateDump.h&#xff0c;CreateDump.cpp文件&#xff0c…

Linux: FS: inotify

这个和网卡的event-notify是一样的逻辑,内核看到有什么事情发生,可以通知到用户,然后用户可以根据自己的需求做一些处理。第一次看到,记录一下算是可以日后可以用到的功能。 man inotify。 inotify - monitoring filesystem events 描述: The inotify API provides a mec…

java+springboot物资连锁仓库经营商业管理系统+jsp

主要任务&#xff1a;通过网络搜集与本课题相关的素材资料&#xff0c;认真分析连锁经营商业管理系统的可行性和要实现的功能&#xff0c;做好需求分析&#xff0c;确定该系统的主要功能模块&#xff0c;依据数据库设计的原则对数据库进行设计。最后通过编码实现本系统功能并测…

Python核心编程之此时起步,为时不晚

目录 一、前言 二、程序输出,print语句及“HelloWorld!” 三、程序输入和 raw_input()内建函数

【KPDK】Log Library

DPDK日志库为其他DPDK库和驱动程序提供日志记录功能。默认情况下&#xff0c;在Linux应用程序中&#xff0c;日志既发送到syslog&#xff0c;也发送到控制台。在FreeBSD和Windows应用程序上&#xff0c;日志只发送到控制台。但是&#xff0c;用户可以覆盖日志功能以使用不同的日…