目录
1. Setter注入
2. 构造器注入
3. 字段注入
4. 方法注入
5. 接口注入
6. Lookup注入
7. 注解注入
Spring框架提供了多种依赖注入(DI)的方式来管理对象之间的依赖关系。以下是Spring支持的依赖注入方式:
1. Setter注入
- 定义:通过类的setter方法注入依赖。
- 举例:
方式一 @Component public class MyClass {private MyDependency dependency;@Autowiredpublic void setDependency(MyDependency dependency) {this.dependency = dependency;} }方式二 <bean id="myDependency" class="com.example.MyDependency" /> <bean id="myClass" class="com.example.MyClass"><property name="dependency" ref="myDependency" /> </bean>
2. 构造器注入
- 定义:通过类的构造器注入依赖。
- 举例:
public class MyClass {private MyDependency dependency;public MyClass(MyDependency dependency) {this.dependency = dependency;} }方式一 <bean id="myDependency" class="com.example.MyDependency" /> <bean id="myClass" class="com.example.MyClass"><constructor-arg ref="myDependency" /> </bean>方式二 @Component public class MyClass {private MyDependency dependency;@Autowiredpublic MyClass(@Qualifier("dependency")MyDependency dependency) {this.dependency = dependency;} }
注意:1.@Qualifier("dependency") 可以不写,触发有多个dependency
2.在 Spring 4.3 及以后的版本中,如果这个类只有一个构造方法,那么这个构造方法上面也可以不写 @Autowired 注解。
3. 字段注入
- 定义:直接在类的字段上使用
@Autowired
或@Inject
注解注入依赖。 - 举例:
@Component public class MyClass {@Autowiredprivate MyDependency dependency; }
4. 方法注入
- 定义:通过方法传递依赖,通常与
@Bean
注解一起使用在配置类中。 - 举例:
@Configuration public class MyConfiguration {@Beanpublic MyDependency myDependency() {return new MyDependency();}@Beanpublic MyClass myClass(MyDependency myDependency) {return new MyClass(myDependency);} }
5. 接口注入
- 定义:通过实现特定的接口来注入依赖,这种方式在Spring中不常见,因为它侵入了代码。
- 举例:
public class MyClass implements MyDependencyAware {private MyDependency dependency;@Overridepublic void setMyDependency(MyDependency dependency) {this.dependency = dependency;} }然后方式一 <beans><bean id="dependency" class="com.example.MyDependency"/><bean id="myClass" class="com.example.MyClass"><property name="dependency" ref="dependency"/></bean> </beans>方式二 @Configuration public class AppConfig {@Beanpublic MyDependency dependency() {return new MyDependency();}@Beanpublic MyClass myClass() {MyClass myClass = new MyClass();myClass.setMyDependency(dependency());return myClass;} }
6. Lookup注入
- 定义:通过查找方法来注入原型作用域的依赖,这在处理单例作用域Bean中注入原型作用域Bean时特别有用。
-
Lookup注入每次调用都会创建一个新的原型bean实例
当你使用Lookup注入方法时,每次调用这个方法都会向Spring容器请求一个新的原型bean实例。Spring容器负责管理bean的生命周期,包括原型bean的创建。因此,每次Lookup方法被调用时,都会创建一个新的原型bean,并且这个新创建的bean将是一个全新的实例,与之前创建的实例相互独立。这样可以确保每次操作都能使用到一个全新的对象,避免了状态信息的共享和污染
- 使用场景:在某些情况下,单例bean在运行时可能需要根据不同的条件动态更换其依赖的对象。Lookup注入可以在不重新创建单例bean的情况下,动态地获取新的原型bean实例。
- 举例:
public abstract class MySingletonBean {public abstract MyPrototypeBean getMyPrototypeBean();public void doSomething() {MyPrototypeBean bean = getMyPrototypeBean();// 使用bean做些事情...} }方式一、 <bean id="mySingletonBean" class="com.example.MySingletonBean" scope="singleton"><lookup-method name="getMyPrototypeBean" bean="myPrototypeBean"/> </bean><bean id="myPrototypeBean" class="com.example.MyPrototypeBean" scope="prototype"/>方式二@Configuration public class AppConfig {@Bean@Scope("singleton")public SingletonBean singletonBean() {return new SingletonBean() {@Lookuppublic PrototypeBean createPrototypeBean() {// 此处实现会被Spring动态覆盖return null;}};}@Bean@Scope("prototype")public PrototypeBean prototypeBean() {return new PrototypeBean();} }
7. 注解注入
- 定义:通过注解来注入依赖,常用的注解有
@Autowired
,@Resource
,@Value
,@Inject
等。 - 举例:
@Component public class MyClass {@Resource(name = "myDependency")private MyDependency dependency;@@Autowiredprivate MyDependency2 dependency2;@Value("${some.value}")private String value; }