当前位置: 首页 > news >正文

做网站需要了解的内容seo整站优化外包公司

做网站需要了解的内容,seo整站优化外包公司,网站优化任务,有网站的源代码怎么生成网站文章目录 前言一、Component与Configuration区别二、Configuration的解析三、生成CGLIB动态代理四、目标方法的调用4.1、BeanMethodInterceptor 总结 前言 Configuration是Spring提供的注解,其作用是将该类标识为一个Java 配置类,用来替代传统的 XML 配置…

文章目录

  • 前言
  • 一、@Component与@Configuration区别
  • 二、@Configuration的解析
  • 三、生成CGLIB动态代理
  • 四、目标方法的调用
    • 4.1、BeanMethodInterceptor
  • 总结


前言

  @Configuration是Spring提供的注解,其作用是将该类标识为一个Java 配置类,用来替代传统的 XML 配置文件:

@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyService();}
}

  上述代码等价于传统 XML 中:

<bean id="myService" class="com.example.MyService"/>

  与标注了@Component注解的配置类相比,区别在于Spring 在解析@Configuration 类时,会使用 CGLIB 生成子类代理,重写其中所有@Bean方法。


一、@Component与@Configuration区别

  @Configuration案例工程:

public class MainApp {public static void main(String[] args) {// 创建应用上下文AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);AppConfig appConfig = context.getBean(AppConfig.class);System.out.println("------ 执行 AppConfig 中的 testBeanMethodCall ------");appConfig.testBeanMethodCall(); // 使用的是代理对象,返回同一个 Beancontext.close();}
}class HelloService {}@Configuration
class AppConfig {@Beanpublic HelloService helloService() {return new HelloService();}public void testBeanMethodCall() {HelloService s1 = helloService();HelloService s2 = helloService();System.out.println("AppConfig -> helloService() s1 == s2 ? " + (s1 == s2));}
}

  运行结果:

------ 执行 AppConfig 中的 testBeanMethodCall ------
AppConfig -> helloService() s1 == s2 ? true

  @Component案例工程:

public class MainApp {public static void main(String[] args) {// 创建应用上下文AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);AppConfig appConfig = context.getBean(AppConfig.class);System.out.println("------ 执行 AppConfig 中的 testBeanMethodCall ------");appConfig.testBeanMethodCall(); // 使用的是代理对象,返回同一个 Beancontext.close();}
}class HelloService {}@Component
class AppConfig {@Beanpublic HelloService helloService() {return new HelloService();}public void testBeanMethodCall() {HelloService s1 = helloService();HelloService s2 = helloService();System.out.println("AppConfig -> helloService() s1 == s2 ? " + (s1 == s2));}
}

  运行结果:

------ 执行 AppConfig 中的 testBeanMethodCall ------
AppConfig -> helloService() s1 == s2 ? false


  通过最终的运行结果可以看出,被@Configuration修饰的配置类中,获取多次被@Bean注解标注的类,**获取到的都是相同的实例。**而被@Component修饰的配置类中,获取多次被@Bean注解标注的类,每次获取到的都是新的实例。

二、@Configuration的解析

  @Configuration的解析,同样在ConfigurationClassPostProcessor后置处理器中:
在这里插入图片描述
  如果当前配置类上,有@Configuration注解,那么会根据proxyBeanMethods的值,走不同的分支,proxyBeanMethods@Configuration注解的属性,默认为true:
在这里插入图片描述
  在配置类上加入了@Configuration注解,并且没有显式地标注proxyBeanMethods为false,则会将配置类的bean定义中的attributes的value设置为full,表示当前的配置类是一个完整的配置类:
在这里插入图片描述
在这里插入图片描述
  上述的过程是@Configuration的解析阶段

三、生成CGLIB动态代理

  ConfigurationClassPostProcessor后置处理器,实现了BeanDefinitionRegistryPostProcessor,而BeanDefinitionRegistryPostProcessor又继承了普通的bean工厂后处理器BeanFactoryPostProcessor
在这里插入图片描述
  在invokeBeanFactoryPostProcessorsinvokeBeanFactoryPostProcessors方法中,会调用ConfigurationClassPostProcessor重写的父类BeanFactoryPostProcessorpostProcessBeanFactory方法:
在这里插入图片描述

  收集所有bean定义的attributes的value为full的bean成map。key是bean的名称,value是对应的bean定义,在上面的案例工程中对应的就是AppConfig类。

att
  然后进行遍历,生成CGLIB动态代理
在这里插入图片描述
在这里插入图片描述
  这里设置的拦截器链,是定义在ConfigurationClassEnhancer中的一个属性:
在这里插入图片描述

private static final Callback[] CALLBACKS = new Callback[] {new BeanMethodInterceptor(),            // 拦截 @Bean 方法调用,核心代理逻辑new BeanFactoryAwareMethodInterceptor(),// 拦截实现 BeanFactoryAware 的方法NoOp.INSTANCE                          // 无操作回调,默认行为
};

  最后将AppConfig的类型设置为代理类型。

在这里插入图片描述

四、目标方法的调用

  在调用案例工程的testBeanMethodCall时,会走过BeanMethodInterceptor拦截器的intercept方法。
在这里插入图片描述

4.1、BeanMethodInterceptor

  如果容器是第一次调用@Bean的目标方法,就真正执行 @Bean 方法体:
在这里插入图片描述
  否则,直接从容器中获取已有的 bean:
在这里插入图片描述
在这里插入图片描述
关键代码,保证每次从容器中拿到的都是同一个单例实例

总结

特性@Configuration@Component
是否会被 Spring 扫描注册为 Bean
是否支持 @Bean 方法注册 Bean支持(推荐)支持(不推荐)
@Bean 方法是否被代理增强会(返回容器单例对象)不会(每次 new 新对象)
是否能作为配置中心使用推荐用于声明多个 @Bean不推荐作为配置类使用
http://www.dtcms.com/a/590693.html

相关文章:

  • 2025年下半年网络工程师案例分析真题及答案解析
  • 怡清源企业网站建设可行性分析东莞建设网站平台
  • 网站建站网站 小说全国设计网站建设
  • Eclipse 修改字符集
  • 汽车图片查询网站源码如何搭建一个网站
  • 广州网站建设推广易尚ps网页设计案例
  • 宣讲家网站两学一做网站建设合同需要交印花税
  • 徐州企业建站系统网站运营专员具体每天怎么做
  • 小白自己写,量化回测系统stock-quant
  • 做网站的用多少钱制作网站价格
  • 海南网站开发重庆便宜做网站的
  • C语言数组排序的5种方法(附带实例)
  • 网站建设外包服务安全管理制度wordpress戏
  • LLDB 调试入门教程
  • 中山微网站建设多少钱大连市建设部网站官网
  • MCP驱动的AI角色扮演游戏
  • 用html5做的网站素材做网站的人 优帮云
  • 网站开发方法 优帮云宿迁做网站的公司
  • 说说Java有哪些集合类
  • 网站首页顶部图片尺寸北京logo设计
  • 数学周刊第45期(2025年11月03日-11月09日)
  • 网站建设行业新闻有没有做字的网站
  • 网站的设计思想大美互助app
  • 【开题答辩过程】以《基于Android的学院自助洗衣店预约系统的设计与实现》为例,不会开题答辩的可以进来看看
  • 查询成绩的网站怎么做怎样做网站快手刷粉
  • html做网站标题的代码移动网站建设制作公司
  • 学习RT-thread(项目一:基于RT-thread的multi_button控制灯闪烁)
  • 3607. 电网维护
  • 中控技术(SUPCON)亮相ADIPEC,引领工业人工智能发展,推动智能化转型
  • SAP客户对S/4HANA投资回报持怀疑态度