分两种(XML注入---细分(setter注入、构造器注入、工厂方法注入)和注解注入)
一、Spring注入方式
1.setter注入
配置文件:
<bean id="chinese" class="com.bayss.mydc.utils.Chinese">
<!-- 将StoneAxe注入给axe属性 -->
<property name="axe" ref="stoneAxe" />
<property name="name" value="孙悟空"/>
</bean>
类:
public class Chinese implements Person {
private Axe axe;
private String name;
// 设值注入所需的setter方法
public void setAxe(Axe axe) {
this.axe = axe;
}
public void setName(String name) {
this.name = name;
}
// 实现Person接口的userAxe方法
public void useAxe() {
// 调用axe的chop方法,表明Person对象依赖于Axe对象
System.out.println("我是" + name + "用" + axe.chop());
}
}
2.构造器注入
配置文件:
<bean id ="testConstructor" class="com.bayss.mydc.utils.TestConstructor">
<constructor-arg index="0" value="23"></constructor-arg>
<constructor-arg index="1" value="aaa"></constructor-arg>
</bean>
类:
public class TestConstructor {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
public TestConstructor(int age, String name){
this.age = age;
this.name = name;
}
}
3.静态工厂方法注入:
限制:
①静态工厂方法不能有参数,也不能在Spring中定义静态工厂方法的参数;
②静态工厂方法只能是public,不能是private和protected;
③静态工厂方法不能和构造方法注入一起使用。
配置文件:
<bean id="testStaticFactory" class="com.bayss.mydc.utils.TestStaticFactory" factory-method="getInstance"></bean>
类:
public class TestStaticFactory {
private String name = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static TestStaticFactory getInstance(){
return new TestStaticFactory("static factory constructor");
}
public TestStaticFactory(String name) {
this.name = name;
}
}
4.实例工厂方法注入:
配置文件:
<bean id="userDao" class="com.bayss.mydc.utils.UserDao" factory-bean="instanceFactory" factory-method="getUserDao"></bean>
<bean id="instanceFactory" class="com.bayss.mydc.utils.InstanceFactory"></bean>
类:
public class InstanceFactory {
public UserDao getUserDao() {
return new UserDao("instance userDao factory ");
}
}
通过上面的配置,基本可以看出实例工厂比静态工厂就多了一个factory-bean,它定义了工厂bean;看到这里,就能想到,静态工厂创建和实例工厂创建是存在相同的限制的,就是我上面列举的那三条。不同的是实例工厂方法不是静态的,而静态工厂方法必须是静态的。
三种注入的方式讲完了,现在说一说开发中对他们的选择,spring虽然对工厂模式提供了完美的支持,但是在用到IoC模式设计系统时,就尽量不要用工厂类,spring支持工厂模式更多的是用来解决老系统的遗留问题的,是为了和遗留系统很好的集成,因此,在遇到遗留系统时,工厂模式是不错的选择,但如果您正在开发一套新系统,那就尽量不要使用工厂模式。
依赖注入的理解:也叫面向接口编程,在定义java依赖关系的时候通过接口进行定义,然后通过配置文件配置对应的实体类来进行关系的注入(注解也是这样),这种方式有利于解耦,程序设计没有那么的紧密
总结:上面说的四种,静态工厂注入和实例工厂原理都是set注入方式,其实应该还有一种叫接口注入,依赖注入的方式宏观分为三种:set注入、构造器注入和接口注入
接口注入:就是额外定义一个接口,通过调用接口,将所要注入的实体注入到类中,其实本质和setter注入以及构造器注入没有区别,还额外增加了一个类,所以都不怎么用了