网站设计需要那些人,马蹄室内设计官网,wordpress创建模板,关于学校的网页设计介绍
在Spring框架中#xff0c;依赖注入#xff08;Dependency Injection, DI#xff09;是实现控制反转#xff08;Inversion of Control, IoC#xff09;的核心机制。
除了通过XML配置的注入方式#xff08;已逐渐被淘汰#xff09;#xff0c;Spring还支持多种基…介绍
在Spring框架中依赖注入Dependency Injection, DI是实现控制反转Inversion of Control, IoC的核心机制。
除了通过XML配置的注入方式已逐渐被淘汰Spring还支持多种基于注解和Java配置的注入方式。以下是常见的注入方式 构造方法注入Constructor Injection 描述通过构造方法将依赖注入到Bean中。 优点 强制依赖确保Bean在创建时就拥有所有必需的依赖。 适合不可变对象属性可以声明为final。 线程安全。 使用场景推荐用于强依赖的场景。 示例 Component
public class DemoService {private final DemoRepository repository;// 从Spring 4.3开始如果只有一个构造方法可以省略AutowiredAutowired public DemoService(DemoRepository repository) {this.repository repository;}
}
Setter方法注入Setter Injection 描述通过Setter方法将依赖注入到Bean中。 优点 灵活性高可以在对象创建后动态修改依赖。 适合可选依赖。 使用场景适合依赖是可选的或需要动态修改的场景。 示例
Component
public class DemoService {private DemoRepository repository;Autowiredpublic void setRepository(DemoRepository repository) {this.repository repository;}
}
字段注入Field Injection 描述直接在字段上使用Autowired注解注入依赖。 优点 代码简洁无需编写构造方法或Setter方法。 缺点 依赖关系不明确难以测试无法通过构造方法或Setter方法注入Mock对象。 违反了单一职责原则隐藏了类的依赖关系。 使用场景适合简单的场景但不推荐在生产代码中使用。 示例
Component
public class DemoService {Autowiredprivate DemoRepository repository;
}
方法注入Method Injection 描述通过任意方法注入依赖方法可以是普通方法或Bean生命周期回调方法如PostConstruct。 优点 灵活性高可以在方法中执行额外的逻辑。 使用场景适合需要在注入时执行额外逻辑的场景。 示例
Component
public class DemoService {private DemoRepository repository;Autowiredpublic void setupRepository(DemoRepository repository) {this.repository repository;// 可以在这里执行其他逻辑}
} 接口注入Interface Injection 描述通过实现特定接口来注入依赖。Spring本身并不直接支持这种方式但可以通过自定义接口和AOP实现。 优点 高度灵活适合需要动态注入的场景。 缺点 实现复杂代码侵入性强。 使用场景适合需要高度自定义注入逻辑的场景。 示例
public interface RepositoryAware {void setRepository(DemoRepository repository);
}Component
public class DemoService implements RepositoryAware {private DemoRepository repository;Overridepublic void setRepository(DemoRepository repository) {this.repository repository;}
}
注解注入Annotation-based Injection 描述通过注解如Autowired、Resource、Inject实现依赖注入。 优点 代码简洁易于使用。 支持多种注入方式构造方法、Setter方法、字段等。 使用场景适合大多数基于注解的依赖注入场景。 示例
Component
public class DemoService {Autowiredprivate DemoRepository repository;}
Java配置注入Java Configuration Injection 描述通过Configuration类和Bean方法显式配置依赖注入。 优点 完全基于Java代码无需XML配置。 适合需要复杂逻辑的依赖配置。 使用场景适合需要显式控制Bean创建和依赖注入的场景。 示例
Configuration
public class DemoConfig {Beanpublic DemoRepository demoRepository() {return new DemoRepository();}Beanpublic DemoService demoService() {return new DemoService(demoRepository());}
}
Lookup方法注入Lookup Method Injection 描述通过Lookup注解或lookup-method标签实现方法级别的依赖注入通常用于注入原型PrototypeBean到单例SingletonBean中。 优点 解决单例Bean中注入原型Bean的问题。 使用场景适合需要每次调用方法时返回不同实例的场景。 示例
Component
public abstract class DemoService {Lookuppublic abstract DemoPrototypeBean getPrototypeBean();public void doSomething() {DemoPrototypeBean bean getPrototypeBean();// 使用bean}}
总结
Spring提供了多种依赖注入方式每种方式都有其适用场景和优缺点。以下是推荐的使用方式 推荐构造方法注入强制依赖、线程安全、不可变性。 可选Setter方法注入适合可选依赖或动态修改依赖。 不推荐字段注入代码简洁但隐藏依赖关系难以测试。 特殊场景方法注入、接口注入、Lookup方法注入等适合特定需求。