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

网站建设与网页制作湖南网站建设推荐

网站建设与网页制作,湖南网站建设推荐,做网站的公司都很小吗,自己在电脑上建文档做网站怎么做引言:Spring中的两个关键角色 在Spring框架中,Configuration和Component都是常用的注解,但它们有着本质的区别。许多开发者在使用时容易混淆它们的行为,特别是当涉及Bean方法时。本文将深入剖析这两者的核心区别,并通过…

引言:Spring中的两个关键角色

在Spring框架中,@Configuration@Component都是常用的注解,但它们有着本质的区别。许多开发者在使用时容易混淆它们的行为,特别是当涉及@Bean方法时。本文将深入剖析这两者的核心区别,并通过代码示例展示它们的实际行为差异。

核心区别一览表

场景被标记的类本身类内部调用 @Bean 方法
@Component/@Service默认单例每次调用都创建新对象
@Configuration默认单例调用其他 @Bean 方法返回单例

这个表格揭示了Spring中一个关键但常被误解的区别:类本身的单例行为与类内部方法调用的单例行为是不同的概念

场景一:业务组件(@Component/@Service

类本身的单例行为

@Service // 等同于 @Component
public class UserService {// 业务逻辑...
}
  • 类本身是单例
    Spring容器只会创建一个UserService实例
  • 通过@Autowired注入时
    注入的是同一个实例
@Controller
public class UserController {@Autowired private UserService service1; // 单例@Autowired private UserService service2; // 同一个单例public void checkSingleton() {System.out.println(service1 == service2); // 输出 true}
}

关键特性

  • Spring直接管理类的实例化(单例)
  • 不涉及方法调用拦截
  • 适用于业务逻辑组件(Service、Controller等)

场景二:配置类中的@Bean方法调用

危险示例:在@Component中调用@Bean方法

@Component // 错误用法!
public class DatabaseConfig {@Beanpublic DataSource dataSource() {System.out.println("创建新的DataSource实例");return new HikariDataSource(); // 创建连接池}@Beanpublic JdbcTemplate jdbcTemplate() {// 直接调用 → 每次创建新连接池!return new JdbcTemplate(dataSource()); }
}
  • 问题所在
    当Spring调用jdbcTemplate()方法时:
    • 直接执行dataSource()方法
    • 每次调用都new HikariDataSource() → 创建多个连接池
    • 输出结果:
      创建新的DataSource实例
      创建新的DataSource实例
      

根本原因

  • @Component类没有代理机制
  • @Bean方法调用等同于普通Java方法调用
  • 导致单例被破坏,资源被重复创建

安全解决方案

方案一:使用@Configuration代理保护

@Configuration // 关键!
public class CorrectConfig {@Beanpublic A a() {return new A(b()); // ✅ 代理确保总返回同一实例}@Beanpublic B b() { System.out.println("创建B实例");return new B(); }
}
  • 代理机制
    Spring通过CGLIB代理增强@Configuration
  • 单例保护
    多次调用b()返回同一个实例
  • 输出结果:
    创建B实例 // 仅打印一次
    

方案二:使用方法参数注入(推荐)

@Configuration // 或 @Component
public class BestConfig {@Beanpublic A a(B b) { // ✅ 通过参数注入单例return new A(b);}@Beanpublic B b() { return new B(); }
}
  • 最安全的方式
  • 适用于@Configuration@Component
  • ✅ 明确声明依赖关系,代码更清晰

为什么会有这种差异?

  1. @Component/@Service

    • Spring直接管理类的实例化(单例)
    • 不涉及方法调用拦截
    • 设计目标:业务组件实现
  2. @Configuration

    • Spring通过CGLIB代理增强类
    • 拦截@Bean方法调用,确保单例
    • 设计目标:Bean定义和配置中心

实际应用场景

正确使用@Configuration

@Configuration
public class AppConfig {// 全局单例的基础设施@Beanpublic DataSource dataSource() {HikariDataSource ds = new HikariDataSource();ds.setJdbcUrl("jdbc:mysql://localhost/db");return ds;}// 安全调用其他@Bean方法@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);}
}

正确使用@Component

@Service
public class OrderService {// 业务方法public void processOrder(Order order) {// 业务逻辑...}
}

常见错误及修复

错误示例

@Component // 错误!应该用@Configuration
public class PaymentConfig {@Beanpublic PaymentService paymentService() {// 每次创建新验证器 → 破坏单例return new PaymentService(validator()); }@Beanpublic Validator validator() { return new PaymentValidator();}
}

修复方案

@Configuration // 修复方法1:改为@Configuration
public class PaymentConfig {@Beanpublic PaymentService paymentService(Validator validator) { // 修复方法2:参数注入return new PaymentService(validator);}@Beanpublic Validator validator() { return new PaymentValidator();}
}

终极总结

“被@Component@Service标记的类本身默认是单例的,@Autowired注入时不会创建新对象。
但在@Component类内部调用@Bean方法时,会像普通Java方法一样执行,每次调用都创建新实例。
@Configuration类通过CGLIB代理,确保跨@Bean方法调用时始终返回单例。”

这个区别反映了Spring的两种不同机制:

  • 组件管理@Component/@Service):处理类实例本身
  • 配置代理@Configuration):处理方法间的调用关系

结语

理解@Configuration@Component的本质区别对于构建健壮的Spring应用至关重要。记住以下黄金法则:

  1. 配置基础设施 → 使用@Configuration
  2. 声明业务组件 → 使用@Component/@Service/@Controller
  3. 跨Bean依赖 → 总是使用方法参数注入

面试总结

"在 @Configuration 类中,所有 @Bean 方法都会CGLIB 代理。当在同一个配置类中调用其他 @Bean 方法时,Spring 会确保始终返回同一个单例实例。而在 @Component 类中,直接调用 @Bean 方法会像普通 Java 方法一样执行,每次调用都创建新实例,破坏单例性。

@Configuration 用于创建需要全局唯一的基础设施(如数据库连接池、线程池)
@Component 用于声明业务组件(如Service、Controller), 一般不在@Component中去定义@Bean"

http://www.dtcms.com/wzjs/308785.html

相关文章:

  • 黑白摄影网站优化网站排名如何
  • c mvc 大型网站开发b2b网站平台
  • 网站的功能定位和建设运营规划天津网站优化
  • 响应式一页网站百度一下首页网址
  • 营销型企业网站核心网页平台做个业务推广
  • 白银建设工程网站百度商家入驻
  • 手机微信如何制作小程序百度app关键词优化
  • 灌南县规划局网站一品嘉苑规划建设google关键词搜索工具
  • 贵州 跨境电商网站建设开网店3个月来亏了10万
  • wordpress的菜单功能上海营销seo
  • iis网站伪静态怎样精选关键词进行网络搜索
  • 杭州二建建设有限公司网站酒店机票搜索量暴涨
  • 深圳福田住房和建设局网站seo建站优化
  • 怎么做网站企业文化栏目seo综合查询工具
  • wordpress网站测速p2p万能搜索引擎
  • 怎么做网站关键词优化广东清远今天疫情实时动态防控
  • 常用网站开发技术网页设计培训学校
  • 网站建设一般多少钱免费找客户软件
  • 京东物流网络设计架构图seo排名优化公司
  • 长沙哪里做网站百度网盘app下载安装电脑版
  • 佟年为韩商言做的网站广东seo加盟
  • 增城网站建设怎么选择品牌的宣传及推广
  • 刚刚发生了什么大事广西壮族自治区在线seo关键词排名优化
  • 找人做软件网站怎么下载有风险的软件
  • 网站wap版怎么做宁德市委书记
  • 六里桥做网站公司腾讯竞价广告
  • 网站进度表网页seo搜索引擎优化
  • 用wordpress建站广东整治互联网霸王条款
  • 资阳网络营销顾问招聘关键词优化营销
  • php语言的网站建设艺考培训