html5好的网站模板,seo搜索引擎优化原理,网站制作网络推广方案,锡盟本地网站建设Spring Framework 作为一个领先的企业级开发框架#xff0c;以其强大的依赖注入#xff08;Dependency Injection#xff0c;DI#xff09;机制而闻名。DI使得开发者可以更加灵活地管理对象之间的关系#xff0c;而不必过多关注对象的创建和组装。在Spring Framework中以其强大的依赖注入Dependency InjectionDI机制而闻名。DI使得开发者可以更加灵活地管理对象之间的关系而不必过多关注对象的创建和组装。在Spring Framework中依赖注入可以分为两种类型根据Bean名称注入、根据Bean类型注入在本文中我们将聚焦于 Spring 中的一种依赖注入方式——按类型注入并通过一个简单的示例来说明其使用和优势。
什么是依赖注入
don’t call us, we’ll call you
依赖注入是一种先进的设计思想它通过外部注入依赖对象来实现组件之间的松耦合。在 Spring 框架中依赖注入的核心实现便是通过控制反转Inversion of ControlIoC容器。IoC 容器负责实例化、配置和组装应用中的对象并在需要时将它们智能地注入到其他对象中。相较于传统的面向对象思想当业务代码变得复杂时通过直接使用 new 进行对象构造对象间的关系容易导致代码耦合度的上升。Spring 通过控制反转巧妙地解决了这一问题运用了好莱坞原则的理念不要给我们打电话我们会给你打电话。这种思想使得代码更加灵活、可维护并促使了更优雅的代码结构。 Spring 中的依赖注入
在 Spring 中依赖注入有多种方式包括构造函数注入、Setter 方法注入、接口注入等。示例中展示的是一种基于 XML 配置的 Setter 方法注入。
构造函数注入的案例
public class UserService {private final EmailService emailService;// 构造函数注入public UserService(EmailService emailService) {this.emailService emailService;}public void sendWelcomeEmail(String username) {String message Welcome, username !;emailService.sendEmail(welcomeexample.com, message);}
}Setter 方法注入的案例
public class NotificationServiceClient {private NotificationService notificationService;// Setter 方法注入public void setNotificationService(NotificationService notificationService) {this.notificationService notificationService;}public void sendNotification(String message) {notificationService.notifyUser(message);}
}接口注入的案例
public class LoggingService {private Logger logger;// 接口注入public void setLogger(Logger logger) {this.logger logger;}public void logMessage(String message) {logger.log(message);}
}在本文中以知名IP小马哥在《小马哥讲 Spring 核心编程思想》中使用的代码案例展开。 Github源码 GeekTime dependency-injection-context.xml
!-- 通过导入复用 dependency-lookup-context.xml --
import resourcedependency-lookup-context.xml/!-- Auto-Wiring: 按类型注入 --
bean iduserRepository classorg.thinging.in.spring.ioc.overview.repository.UserRepository autowirebyType
/beandependency-lookup-context.xml:
?xml version1.0 encodingUTF-8?
beansxmlnshttp://www.springframework.org/schema/beansxmlns:contexthttp://www.springframework.org/schema/contextxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd!-- context:annotation-config/--!-- context:component-scan base-packageorg.acme /--!-- Root BeanDefinition 不需要合并不存在 parent --!-- 普通 beanDefinition GenericBeanDefinition --!-- 经过合并后 GenericBeanDefinition 变成 RootBeanDefinition --bean iduser classorg.geekbang.thinking.in.spring.ioc.overview.domain.Userproperty nameid value1/property namename value小马哥/property namecity valueHANGZHOU/property nameworkCities valueBEIJING,HANGZHOU/property namelifeCitieslistvalueBEIJING/valuevalueSHANGHAI/value/list/propertyproperty nameconfigFileLocation valueclasspath:/META-INF/user-config.properties//bean!-- 普通 beanDefinition GenericBeanDefinition --!-- 合并后 GenericBeanDefinition 变成 RootBeanDefinition并且覆盖 parent 相关配置--!-- primary true , 增加了一个 address 属性 --bean idsuperUser classorg.geekbang.thinking.in.spring.ioc.overview.domain.SuperUser parentuserprimarytrueproperty nameaddress value杭州//beanbean idobjectFactory classorg.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBeanproperty nametargetBeanName valueuser//bean
/beans在这个例子中我们通过 XML 配置文件导入了 dependency-lookup-context.xml并配置了一个名为 userRepository 的 UserRepository Bean并通过 autowire“byType” 实现了自动按类型注入。这样Spring 容器会在运行时查找并注入与 UserRepository 类型匹配的 User 对象。
UserRepository 类
public class UserRepository {/*** 自定义Bean*/private CollectionUser users;public CollectionUser getUsers() {return users;}public void setUsers(CollectionUser users) {this.users users;}
}UserRepository 类中定义了一个名为 users 的集合属性并提供了相应的 Getter 和 Setter 方法。通过 Setter 方法我们可以在 Spring 容器中配置的时候注入一组 User 对象。
主程序
public static void main(String[] args) {// 配置 XML 配置文件// 启动 Spring 应用上下文BeanFactory beanFactory new ClassPathXmlApplicationContext(classpath:/META-INF/dependency-injection-context.xml);UserRepository userRepository beanFactory.getBean(userRepository, UserRepository.class);System.out.println(userRepository.getUsers());
}在主程序中我们通过 ClassPathXmlApplicationContext 加载了 XML 配置文件获取了名为 userRepository 的 UserRepository Bean并输出了其中包含的 User 对象集合。
结论
通过这个简单的示例我们了解了 Spring Framework 中依赖注入的基本原理。依赖注入通过控制反转容器实现使得应用程序中的对象不再负责管理自己的依赖关系而是由 IoC 容器负责。这种设计模式降低了组件之间的耦合度提高了代码的可测试性和可维护性是 Spring 成功的关键之一。在实际项目中我们可以根据需求选择适合的依赖注入方式使代码更加清晰、灵活且易于维护。
后续内容文章持续更新中…
近期发布。 关于我
你好我是Debug.c。微信公众号种颗代码技术树 的维护者一个跨专业自学Java对技术保持热爱的bug猿同样也是在某二线城市打拼四年余的Java Coder。
在掘金、CSDN、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。
如果您对我感兴趣请联系我。
若有收获就点个赞吧喜欢原图请私信我。