秦皇岛做网站外包电子商务网站数据库怎么做
2026/5/13 10:11:09 网站建设 项目流程
秦皇岛做网站外包,电子商务网站数据库怎么做,东莞产品网络推广,python网页开发总结#xff1a; Configuration 用来定义 Java 配置类#xff0c;用 Bean 方法声明 Spring 管理的 Bean#xff1b;Spring 会把它当作配置信息并用 CGLIB 动态代理#xff08;默认#xff09;处理#xff0c;从而保证 Bean 方法的单例语义与依赖注入正确。下面分条讲清楚…总结Configuration用来定义Java 配置类用Bean方法声明 Spring 管理的 BeanSpring 会把它当作配置信息并用 CGLIB 动态代理默认处理从而保证Bean方法的单例语义与依赖注入正确。下面分条讲清楚你必须掌握的点配合例子和常见面试问答。1. 基本用法最常见的场景Configuration public class AppConfig { Bean public UserService userService() { return new UserService(userRepository()); } Bean public UserRepository userRepository() { return new UserRepository(); } }把AppConfig放到 Spring 上下文中例如通过SpringBootApplication的组件扫描或手工AnnotationConfigApplicationContext(AppConfig.class)Spring 会解析Bean并注册对应的 Bean。默认Bean的作用域是singleton。2.Configuration与Component的区别Configuration本身带有Component因此可以被扫描但它的语义比普通Component更强Configuration类会被 Spring 用 CGLIB 生成子类代理以保证同一配置类中Bean方法相互调用时仍然返回容器管理的单例实例。如果你用ComponentBean理论上也能则不会有 proxy 的增强语义互相调用会直接执行方法可能导致重复实例化。3. 关键属性proxyBeanMethodsSpring 5.2Configuration(proxyBeanMethods true)是默认会生成代理保证Bean调用返回容器里同一个 bean。如果你把它设置为falseSpring 不会对配置类做 CGLIB 代理性能更好但失去方法间调用的单例保证适合配置类只是用作“工厂”且不同Bean之间互不调用的场景常见于 Spring Boot 的自动配置优化。示例说明差异Configuration(proxyBeanMethods true) // 或 false public class Config { Bean public A a() { return new A(b()); } Bean public B b() { return new B(); } }若proxyBeanMethods truea()内部调用b()实际会走代理返回容器中的B单例。若proxyBeanMethods falsea()直接调用b()方法返回的是新创建的 B 实例会破坏单例语义。4. 为什么需要 CGLIB 代理简要原理Spring 在解析Configuration时会把该类变成一个代理子类CGLIB当在配置类内调用b()时调用会被拦截代理去容器中取B如果已存在而不是直接在方法体内 new 一个新对象。因此不要把Configuration类声明为finalCGLIB 需要继承。5. 常用组合与扩展Configuration常和以下注解一起使用Bean声明一个 bean。Import引入其他配置类或配置组件。Profile按环境条件激活配置。PropertySource加载属性文件但在 Spring Boot 中通常使用application.properties/yml。Enable*例如EnableTransactionManagement用于开启某些功能。ConfigurationProperties与Configuration不同前者用于绑定配置属性。6. Bean 生命周期与依赖注入风格Bean方法内部可以用构造器或者 setter 来注入依赖示例里用 new 时手动传入。也可以在Bean方法参数中声明需要注入的其他 beanSpring 会自动注入更推荐Bean public UserService userService(UserRepository repo) { return new UserService(repo); }此方式可避免proxyBeanMethods的问题因为注入在容器层面已完成。7. 常见坑 注意事项不要把Configuration类标记为final— CGLIB 代理需要继承。如果Configuration(proxyBeanMethodsfalse)切忌在同一类中互相调用Bean方法会创建多个实例。如果你只是把配置类当作“静态工厂”并且Bean互不依赖可以用proxyBeanMethodsfalse提升性能Spring Boot 的自动配置大量使用该优化。Configuration会被ConfigurationClassPostProcessor处理发生在常规 bean 定义之前。如果忘记导入配置类到上下文Bean不会生效需要 component-scan、Import 或在 ApplicationContext 注册。Bean方法不要写为privateSpring 需要能调用/代理。8. 面试常考简短问答可背Q:Configuration的作用A: 声明 Java 配置类里面用Bean注册 Spring BeanSpring 会对该类进行特殊处理默认 proxyBeanMethodstrue。Q:Configuration和Component有什么不同A:Configuration会被 Spring 作为配置并生成代理以保证Bean方法互调仍返回容器的唯一 BeanComponent没有这些语义。Q: 什么是proxyBeanMethodsA: 控制是否对配置类做CGLIB 代理。true默认保证方法间互调返回容器中的单例false不代理性能更好但会失去方法调度保障。Q:Configuration类可以是final吗A: 不应是final因为默认是通过子类代理CGLIB。9. 完整 runnable 示例演示 proxyBeanMethods 的差异Configuration(proxyBeanMethods true) // 改成 false 看对比 public class DemoConfig { Bean public ServiceA serviceA() { System.out.println(create ServiceA); return new ServiceA(serviceB()); } Bean public ServiceB serviceB() { System.out.println(create ServiceB); return new ServiceB(); } } public class ServiceA { private final ServiceB b; public ServiceA(ServiceB b) { this.b b; } } public class ServiceB { }启动AnnotationConfigApplicationContext(DemoConfig.class)。proxyBeanMethods true输出通常只会看到create ServiceB一次ServiceB为单例。proxyBeanMethods false可能会看到create ServiceB两次serviceA()内部直接 new 的ServiceB与容器注册的ServiceB造成重复实例。10. 什么时候用Configuration而不是 XML / 注解扫描推荐在现代 Spring / Spring Boot 项目中使用Configuration类型安全、可重构、IDE 支持好。XML 仅在需要兼容老系统或某些特殊场景时使用。

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

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

立即咨询