如何查询网站备案信息财务软件排名
2026/2/18 22:26:45 网站建设 项目流程
如何查询网站备案信息,财务软件排名,谷歌云服务器永久免费,河南省城乡与住房建设厅网站1、Spring是什么? Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架#xff0c;目的是用于简化企业应用程序的开发#xff0c;它使得开发者只需要关心业务需求。主要包括以下七个模块#xff1a; Spring Context#xff1a;提供框架式的…1、Spring是什么?Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架目的是用于简化企业应用程序的开发它使得开发者只需要关心业务需求。主要包括以下七个模块Spring Context提供框架式的Bean访问方式以及企业级功能JNDI、定时任务等Spring Core核心类库所有功能都依赖于该类库提供IOC和DI服务Spring AOPAOP服务Spring Web提供了基本的面向Web的综合特性提供对常见框架如Struts2的支持Spring能够管理这些框架将Spring的资源注入给框架也能在这些框架的前后插入拦截器Spring MVC提供面向Web应用的Model-View-Controller即MVC实现。Spring DAO对JDBC的抽象封装简化了数据访问异常的处理并能统一管理JDBC事务Spring ORM对现有的ORM框架的支持下图对应的是Spring 4.x的版本5.x版本中Web模块的Portlet组件已经被废弃2、Spring 的优点1spring属于低侵入式设计代码的污染极低2spring的DI机制将对象之间的依赖关系交由框架处理减低组件的耦合性3Spring提供了AOP技术支持将一些通用任务如安全、事务、日志、权限等进行集中式管理从而提供更好的复用。4spring对于主流的应用框架提供了集成支持。3、Spring的IoC理解1什么是IOCIOCInversion of Control控制反转指将对象的控制权转移给Spring框架由 Spring 来负责控制对象的生命周期比如创建、销毁和对象间的依赖关系。最直观的表达就是以前创建对象的时机和主动权都是由自己把控的如果在一个对象中使用另外的对象就必须主动通过new指令去创建依赖对象使用完后还需要销毁比如Connection等对象始终会和其他接口或类耦合起来。而 IOC 则是由专门的容器来帮忙创建对象将所有的类都在 Spring 容器中登记当需要某个对象时不再需要自己主动去 new 了只需告诉 Spring 容器然后 Spring 就会在系统运行到适当的时机把你想要的对象主动给你。也就是说对于某个具体的对象而言以前是由自己控制它所引用对象的生命周期而在IOC中所有的对象都被 Spring 控制控制对象生命周期的不再是引用它的对象而是Spring容器由 Spring 容器帮我们创建、查找及注入依赖对象而引用对象只是被动的接受依赖对象所以这叫控制反转。2什么是DIIoC 的一个重点就是在程序运行时动态的向某个对象提供它所需要的其他对象这一点是通过DIDependency Injection依赖注入来实现的即应用程序在运行时依赖 IoC 容器来动态注入对象所需要的外部依赖。而 Spring 的 DI 具体就是通过反射实现注入的反射允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性3IoC的原理Spring 的 IoC 的实现原理就是工厂模式加反射机制而在 Spring 容器中Bean 对象如何注册到 IoC 容器以及Bean对象的加载、实例篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】​https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho化、4、Spring的AOP理解OOP面向对象允许开发者定义纵向的关系但并不适用于定义横向的关系会导致大量代码的重复而不利于各个模块的重用。AOP一般称为面向切面作为面向对象的一种补充用于将那些与业务无关但却对多个对象产生影响的公共行为和逻辑抽取并封装为一个可重用的模块这个模块被命名为“切面”Aspect减少系统中的重复代码降低了模块间的耦合度提高系统的可维护性。可用于权限认证、日志、事务处理。AOP实现的关键在于 代理模式AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ动态代理则以Spring AOP为代表。1AspectJ是静态代理也称为编译时增强AOP框架会在编译阶段生成AOP代理类并将AspectJ(切面)织入到Java字节码中运行的时候就是增强之后的AOP对象。2Spring AOP使用的动态代理所谓的动态代理就是说AOP框架不会去修改字节码而是每次运行时在内存中临时为方法生成一个AOP对象这个AOP对象包含了目标对象的全部方法并且在特定的切点做了增强处理并回调原对象的方法。Spring AOP中的动态代理主要有两种方式JDK动态代理和CGLIB动态代理① JDK动态代理只提供接口的代理不支持类的代理要求被代理类实现接口。JDK动态代理的核心是InvocationHandler接口和Proxy类在获取代理对象时使用Proxy类来动态创建目标类的代理类即最终真正的代理类这个类继承自Proxy并实现了我们定义的接口当代理对象调用真实对象的方法时 InvocationHandler 通过invoke()方法反射来调用目标类中的代码动态地将横切逻辑和业务编织在一起InvocationHandler 的 invoke(Object proxy,Method method,Object[] args)proxy是最终生成的代理对象; method 是被代理目标实例的某个具体方法; args 是被代理目标实例某个方法的具体入参, 在方法反射调用时使用。② 如果被代理类没有实现接口那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIBCode Generation Library是一个代码生成的类库可以在运行时动态的生成指定类的一个子类对象并覆盖其中特定方法并添加增强代码从而实现AOP。CGLIB是通过继承的方式做的动态代理因此如果某个类被标记为final那么它是无法使用CGLIB做动态代理的。3静态代理与动态代理区别在于生成AOP代理对象的时机不同相对来说AspectJ的静态代理方式具有更好的性能但是AspectJ需要特定的编译器进行处理而Spring AOP则无需特定的编译器处理。IoC让相互协作的组件保持松散的耦合而AOP编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件。5、Spring AOP里面的几个名词的概念1连接点Join point指程序运行过程中所执行的方法。在Spring AOP中一个连接点总代表一个方法的执行。2切面Aspect被抽取出来的公共模块可以用来会横切多个对象。Aspect切面可以看成 Pointcut切点 和 Advice通知 的结合一个切面可以由多个切点和通知组成。在Spring AOP中切面可以在类上使用 AspectJ 注解来实现。3切点Pointcut切点用于定义 要对哪些Join point进行拦截。切点分为execution方式和annotation方式。execution方式可以用路径表达式指定对哪些方法拦截比如指定拦截add*、search*。annotation方式可以指定被哪些注解修饰的代码进行拦截。4通知Advice指要在连接点Join Point上执行的动作即增强的逻辑比如权限校验和、日志记录等。通知有各种类型包括Around、Before、After、After returning、After throwing。5目标对象Target包含连接点的对象也称作被通知Advice的对象。 由于Spring AOP是通过动态代理实现的所以这个对象永远是一个代理对象。6织入Weaving通过动态代理在目标对象Target的方法即连接点Join point中执行增强逻辑Advice的过程。7引入Introduction添加额外的方法或者字段到被通知的类。Spring允许引入新的接口以及对应的实现到任何被代理的对象。例如你可以使用一个引入来使bean实现 IsModified 接口以便简化缓存机制。几个概念的关系图可以参考下图网上有张非常形象的图描述了各个概念所处的场景和作用贴在这里供大家理解6、Spring通知Advice有哪些类型6.1、Advice的类型1前置通知Before Advice在连接点Join point之前执行的通知。2后置通知After Advice当连接点退出的时候执行的通知不论是正常返回还是异常退出。3环绕通知Around Advice包围一个连接点的通知这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也可以选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。4返回后通知AfterReturning Advice在连接点正常完成后执行的通知如果连接点抛出异常则不执行5抛出异常后通知AfterThrowing advice在方法抛出异常退出时执行的通知6.2、Advice的执行顺序1没有异常情况下的执行顺序around before advicebefore advicetarget method 执行after advicearound after adviceafterReturning advice2出现异常情况下的执行顺序around before advicebefore advicetarget method 执行after advicearound after adviceafterThrowing advicejava.lang.RuntimeException异常发生7、Spring容器的启动流程1初始化Spring容器注册内置的BeanPostProcessor的BeanDefinition到容器中① 实例化BeanFactory【DefaultListableBeanFactory】工厂用于生成Bean对象② 实例化BeanDefinitionReader注解配置读取器用于对特定注解如Service、Repository的类进行读取转化成 BeanDefinition 对象BeanDefinition 是 Spring 中极其重要的一个概念它存储了 bean 对象的所有特征信息如是否单例是否懒加载factoryBeanName 等③ 实例化ClassPathBeanDefinitionScanner路径扫描器用于对指定的包目录进行扫描查找 bean 对象2将配置类的BeanDefinition注册到容器中3调用refresh()方法刷新容器① prepareRefresh()刷新前的预处理② obtainFreshBeanFactory()获取在容器初始化时创建的BeanFactory③ prepareBeanFactory(beanFactory)BeanFactory的预处理工作向容器中添加一些组件④ postProcessBeanFactory(beanFactory)子类重写该方法可以实现在BeanFactory创建并预处理完成以后做进一步的设置⑤ invokeBeanFactoryPostProcessors(beanFactory)在BeanFactory标准初始化之后执行BeanFactoryPostProcessor的方法即BeanFactory的后置处理器⑥ registerBeanPostProcessors(beanFactory)向容器中注册Bean的后置处理器BeanPostProcessor它的主要作用是干预Spring初始化bean的流程从而完成代理、自动注入、循环依赖等功能⑦ initMessageSource()初始化MessageSource组件主要用于做国际化功能消息绑定与消息解析⑧ initApplicationEventMulticaster()初始化事件派发器在注册监听器时会用到⑨ onRefresh()留给子容器、子类重写这个方法在容器刷新的时候可以自定义逻辑⑩ registerListeners()注册监听器将容器中所有的ApplicationListener注册到事件派发器中并派发之前步骤产生的事件⑪ finishBeanFactoryInitialization(beanFactory)初始化所有剩下的单实例bean核心方法是preInstantiateSingletons()会调用getBean()方法创建对象⑫ finishRefresh()发布BeanFactory容器刷新完成事件8、BeanFactory和ApplicationContext有什么区别BeanFactory和ApplicationContext是Spring的两大核心接口都可以当做Spring的容器。1BeanFactory是Spring里面最底层的接口是IoC的核心定义了IoC的基本功能包含了各种Bean的定义、加载、实例化依赖注入和生命周期管理。ApplicationContext接口作为BeanFactory的子类除了提供BeanFactory所具有的功能外还提供了更完整的框架功能继承MessageSource因此支持国际化。资源文件访问如URL和文件ResourceLoader。载入多个有继承关系上下文即同时加载多个配置文件 使得每一个上下文都专注于一个特定的层次比如应用的web层。提供在监听器中注册bean的事件。2①BeanFactroy采用的是延迟加载形式来注入Bean的只有在使用到某个Bean时(调用getBean())才对该Bean进行加载实例化。这样我们就不能提前发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入BeanFacotry加载后直至第一次使用调用getBean方法才会抛出异常。②ApplicationContext它是在容器启动时一次性创建了所有的Bean。这样在容器启动时我们就可以发现Spring中存在的配置错误这样有利于检查所依赖属性是否注入。③ApplicationContext启动后预载入所有的单实例Bean所以在运行的时候速度比较快因为它们已经创建好了。相对于BeanFactoryApplicationContext 唯一的不足是占用内存空间当应用程序配置Bean较多时程序启动较慢。3BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用但两者之间的区别是BeanFactory需要手动注册而ApplicationContext则是自动注册。4BeanFactory通常以编程的方式被创建ApplicationContext还能以声明的方式创建如使用ContextLoader。篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】​https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho9、Spring Bean的生命周期简单来说Spring Bean的生命周期只有四个阶段实例化 Instantiation -- 属性赋值 Populate -- 初始化 Initialization -- 销毁 Destruction但具体来说Spring Bean的生命周期包含下图的流程1实例化Bean对于BeanFactory容器当客户向容器请求一个尚未初始化的bean时或初始化bean的时候需要注入另一个尚未初始化的依赖时容器就会调用createBean进行实例化。对于ApplicationContext容器当容器启动结束后通过获取BeanDefinition对象中的信息实例化所有的bean。2设置对象属性依赖注入实例化后的对象被封装在BeanWrapper对象中紧接着Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成属性设置与依赖注入。3处理Aware接口Spring会检测该对象是否实现了xxxAware接口通过Aware类型的接口可以让我们拿到Spring容器的一些资源①如果这个Bean实现了BeanNameAware接口会调用它实现的setBeanName(String beanId)方法传入Bean的名字②如果这个Bean实现了BeanClassLoaderAware接口调用setBeanClassLoader()方法传入ClassLoader对象的实例。②如果这个Bean实现了BeanFactoryAware接口会调用它实现的setBeanFactory()方法传递的是Spring工厂自身。③如果这个Bean实现了ApplicationContextAware接口会调用setApplicationContext(ApplicationContext)方法传入Spring上下文4BeanPostProcessor前置处理如果想对Bean进行一些自定义的前置处理那么可以让Bean实现了BeanPostProcessor接口那将会调用postProcessBeforeInitialization(Object obj, String s)方法。5InitializingBean如果Bean实现了InitializingBean接口执行afeterPropertiesSet()方法。6init-method如果Bean在Spring配置文件中配置了 init-method 属性则会自动调用其配置的初始化方法。7BeanPostProcessor后置处理如果这个Bean实现了BeanPostProcessor接口将会调用postProcessAfterInitialization(Object obj, String s)方法由于这个方法是在Bean初始化结束时调用的所以可以被应用于内存或缓存技术以上几个步骤完成后Bean就已经被正确创建了之后就可以使用这个Bean了。8DisposableBean当Bean不再需要时会经过清理阶段如果Bean实现了DisposableBean这个接口会调用其实现的destroy()方法9destroy-method最后如果这个Bean的Spring配置中配置了destroy-method属性会自动调用其配置的销毁方法。如果对bean详细加载流程的感兴趣的读者可以阅读这篇文章Spring的Bean加载流程_张维鹏的博客-CSDN博客10、 Spring中bean的作用域1singleton默认作用域单例bean每个容器中只有一个bean的实例。2prototype为每一个bean请求创建一个实例。3request为每一个request请求创建一个实例在请求完成以后bean会失效并被垃圾回收器回收。4session与request范围类似同一个session会话共享一个实例不同会话使用不同的实例。5global-session全局作用域所有会话共享一个实例。如果想要声明让所有会话共享的存储变量的话那么这全局变量需要存储在global-session中。11、Spring框架中的Bean是线程安全的么如果线程不安全那么如何处理Spring容器本身并没有提供Bean的线程安全策略因此可以说Spring容器中的Bean本身不具备线程安全的特性但是具体情况还是要结合Bean的作用域来讨论。1对于prototype作用域的Bean每次都创建一个新对象也就是线程之间不存在Bean共享因此不会有线程安全问题。2对于singleton作用域的Bean所有的线程都共享一个单例实例的Bean因此是存在线程安全问题的。但是如果单例Bean是一个无状态Bean也就是线程中的操作不会对Bean的成员执行查询以外的操作那么这个单例Bean是线程安全的。比如Controller类、Service类和Dao等这些Bean大多是无状态的只关注于方法本身。有状态Bean(Stateful Bean) 就是有实例变量的对象可以保存数据是非线程安全的。无状态Bean(Stateless Bean)就是没有实例变量的对象不能保存数据是不变类是线程安全的。对于有状态的bean比如Model和View就需要自行保证线程安全最浅显的解决办法就是将有状态的bean的作用域由“singleton”改为“prototype”。也可以采用ThreadLocal解决线程安全问题为每个线程提供一个独立的变量副本不同线程只操作自己线程的副本变量。ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式仅提供一份变量不同的线程在访问前需要获取锁没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式。ThreadLocal会为每一个线程提供一个独立的变量副本从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本从而也就没有必要对该变量进行同步了。12、Spring基于xml注入bean的几种方式set()方法注入构造器注入①通过index设置参数的位置②通过type设置参数类型静态工厂注入实例工厂详细内容请参考这篇文章Spring中bean的注入方式13、Spring如何解决循环依赖问题详细内容强烈建议参考这篇文章Spring如何解决循环依赖问题循环依赖问题在Spring中主要有三种情况1通过构造方法进行依赖注入时产生的循环依赖问题。2通过setter方法进行依赖注入且是在多例原型模式下产生的循环依赖问题。3通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题。在Spring中只有第3种方式的循环依赖问题被解决了其他两种方式在遇到循环依赖问题时都会产生异常。这是因为第一种构造方法注入的情况下在new对象的时候就会堵塞住了其实也就是”先有鸡还是先有蛋“的历史难题。第二种setter方法多例的情况下每一次getBean()时都会产生一个新的Bean如此反复下去就会有无穷无尽的Bean产生了最终就会导致OOM问题的出现。Spring在单例模式下的setter方法依赖注入引起的循环依赖问题主要是通过二级缓存和三级缓存来解决的其中三级缓存是主要功臣。解决的核心原理就是在对象实例化之后依赖注入之前Spring提前暴露的Bean实例的引用在第三级缓存中进行存储。14、Spring的自动装配在spring中使用autowire来配置自动装载模式对象无需自己查找或创建与其关联的其他对象由容器负责把需要相互协作的对象引用赋予各个对象。1在Spring框架xml配置中共有5种自动装配no默认的方式是不进行自动装配的通过手工设置ref属性来进行装配bean。byName通过bean的名称进行自动装配如果一个bean的 property 与另一bean 的name 相同就进行自动装配。byType通过参数的数据类型进行自动装配。constructor利用构造函数进行装配并且构造函数的参数通过byType进行装配。autodetect自动探测如果有构造方法通过 construct的方式自动装配否则使用 byType的方式自动装配。2基于注解的自动装配方式使用Autowired、Resource注解来自动装配指定的bean。在使用Autowired注解之前需要在Spring配置文件进行配置。在启动spring IoC时容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器当容器扫描到Autowied、Resource或Inject时就会在IoC容器自动查找需要的bean并装配给该对象的属性。在使用Autowired时首先在容器中查询对应类型的bean如果查询结果刚好为一个就将该bean装配给Autowired指定的数据如果查询的结果不止一个那么Autowired会根据名称来查找如果上述查找的结果为空那么会抛出异常。解决方法时使用requiredfalse。Autowired可用于构造函数、成员变量、Setter方法注Autowired和Resource之间的区别(1) Autowired默认是按照类型装配注入的默认情况下它要求依赖对象必须存在可以设置它required属性为false。(2) Resource默认是按照名称来装配注入的只有当找不到与名称匹配的bean才会按照类型来装配注入。15、Spring事务的实现方式和实现原理Spring事务的本质其实就是数据库对事务的支持没有数据库的事务支持spring是无法提供事务功能的。Spring只提供统一事务管理接口具体实现都是由各数据库自己实现数据库事务的提交和回滚是通过 redo log 和 undo log实现的。Spring会在事务开始时根据当前环境中设置的隔离级别调整数据库隔离级别由此保持一致。1Spring事务的种类spring支持编程式事务管理和声明式事务管理两种方式①编程式事务管理使用TransactionTemplate。②声明式事务管理建立在AOP之上的。其本质是通过AOP功能对方法前后进行拦截将事务处理的功能编织到拦截的方法中也就是在目标方法开始之前启动一个事务在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码只需在配置文件中做相关的事务规则声明或通过Transactional注解的方式便可以将事务规则应用到业务逻辑中减少业务代码的污染。唯一不足地方是最细粒度只能作用到方法级别无法做到像编程式事务那样可以作用到代码块级别。2spring的事务传播机制spring事务的传播机制说的是当多个事务同时存在的时候spring如何处理这些事务的行为。事务传播机制实际上是使用简单的ThreadLocal实现的所以如果调用的方法是在新线程调用的事务传播实际上是会失效的。① PROPAGATION_REQUIRED默认传播行为如果当前没有事务就创建一个新事务如果当前存在事务就加入该事务。② PROPAGATION_REQUIRES_NEW无论当前存不存在事务都创建新事务进行执行。③ PROPAGATION_SUPPORTS如果当前存在事务就加入该事务如果当前不存在事务就以非事务执行。‘④ PROPAGATION_NOT_SUPPORTED以非事务方式执行操作如果当前存在事务就把当前事务挂起。⑤ PROPAGATION_NESTED如果当前存在事务则在嵌套事务内执行如果当前没有事务则按REQUIRED属性执行。⑥ PROPAGATION_MANDATORY如果当前存在事务就加入该事务如果当前不存在事务就抛出异常。⑦ PROPAGATION_NEVER以非事务方式执行如果当前存在事务则抛出异常。3Spring中的隔离级别① ISOLATION_DEFAULT这是个 PlatfromTransactionManager 默认的隔离级别使用数据库默认的事务隔离级别。② ISOLATION_READ_UNCOMMITTED读未提交允许事务在执行过程中读取其他事务未提交的数据。③ ISOLATION_READ_COMMITTED读已提交允许事务在执行过程中读取其他事务已经提交的数据。④ ISOLATION_REPEATABLE_READ可重复读在同一个事务内任意时刻的查询结果都是一致的。⑤ ISOLATION_SERIALIZABLE所有事务逐个依次执行。篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】​https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho16、Spring 框架中都用到了哪些设计模式1工厂模式Spring使用工厂模式通过BeanFactory和ApplicationContext来创建对象2单例模式Bean默认为单例模式3策略模式例如Resource的实现类针对不同的资源文件实现了不同方式的资源获取策略4代理模式Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术5模板方法可以将相同部分的代码放在父类中而将不同的代码放入不同的子类中用来解决代码重复的问题。比如RestTemplate, JmsTemplate, JpaTemplate6适配器模式Spring AOP的增强或通知Advice使用到了适配器模式Spring MVC中也是用到了适配器模式适配Controller7观察者模式Spring事件驱动模型就是观察者模式的一个经典应用。8桥接模式可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库客户在每次访问中根据需要会去访问不同的数据库17、Spring框架中有哪些不同类型的事件Spring 提供了以下5种标准的事件1上下文更新事件ContextRefreshedEvent在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。2上下文开始事件ContextStartedEvent当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。3上下文停止事件ContextStoppedEvent当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。4上下文关闭事件ContextClosedEvent当ApplicationContext被关闭时触发该事件。容器被关闭时其管理的所有单例Bean都被销毁。5请求处理事件RequestHandledEvent在Web应用中当一个http请求request结束触发该事件。如果一个bean实现了ApplicationListener接口当一个ApplicationEvent 被发布以后bean会自动被通知。18、注解的原理1什么是注解Java 注解就是代码中的一些特殊标记元信息用于在编译、类加载、运行时进行解析和使用并执行相应的处理。它本质是继承了 Annotation 的特殊接口其具体实现类是 JDK 动态代理生成的代理类通过反射获取注解时返回的也是 Java 运行时生成的动态代理对象 $Proxy1。通过代理对象调用自定义注解的方法会最终调用 AnnotationInvocationHandler 的 invoke 方法该方法会从 memberValues 这个Map中查询出对应的值而 memberValues 的来源是Java常量池。注解在实际开发中非常常见比如 Java 原生的 Overried、Deprecated 等Spring的 Controller、Service等Lombok 工具类也有大量的注解不过在原生 Java 中还提供了元 Annotation元注解他主要是用来修饰注解的比如 Target、Retention、Document、Inherited 等。Target标识注解可以修饰哪些地方比如方法、成员变量、包等具体取值有以下几种ElementType.TYPE/FIELD/METHOD/PARAMETER/CONSTRUCTOR/LOCAL_VARIABLE/ANNOTATION_TYPE/PACKAGE/TYPE_PARAMETER/TYPE_USERetention什么时候使用注解SOURCE(编译阶段就丢弃) / CLASS(类加载时丢弃) / RUNTIME(始终不会丢弃)一般来说我们自定义的注解都是 RUNTIME 级别的因为大多数情况我们是根据运行时环境去做一些处理一般需要配合反射来使用因为反射是 Java 获取运行是的信息的重要手段Document注解是否会包含在 javadoc 中Inherited定义该注解与子类的关系子类是否能使用。2如何自定义注解① 创建一个自定义注解与创建接口类似但自定义注解需要使用 interface② 添加元注解信息比如 Target、Retention、Document、Inherited 等③ 创建注解方法但注解方法不能带有参数④ 注解方法返回值为基本类型、String、Enums、Annotation 或其数组⑤ 注解可以有默认值Target(FIELD)Retention(RUNTIME)Documentedpublic interface CarName {String value() default ;}AI写代码java运行

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询