Spring的四种注入方式 工作中,无论是被面试还是面试别人,大多都会问到一些重复的内容,所以,自己要先懂的其中的道理,然后才能审查他人,所以,今天我就把Spring的注入方式集中聊一聊.什
工作中,无论是被面试还是面试别人,大多都会问到一些重复的内容,所以,自己要先懂的其中的道理,然后才能审查他人,所以,今天我就把Spring的注入方式集中聊一聊.
什么是IOC"依赖注入"?
在java中,程序开发过程中,在某个类中需要依赖其他类的方法,需要new一个依赖类后再调用类实例的方法,但是会造成程序中存在很多类实例,不好管理.
spring就将这个工作通过程序完成,开发者不用自己去new类实例,而是由spring帮我们new指定的实例,然后注入到需要该对象的类中.
依赖注入的另一种说法就是"控制反转".
spring中有多种依赖注入的形式:1.set注入;2.构造器注入;3.静态工厂注入;4.实例工厂注入
一.set注入
有一个Action类,类中需要实例化一个service对象,那就定义一个私有的成员,然后提供service的set方法(也就是ioc的入口)
public class Action {
//注入对象Service
private Service service;
//被注入对象的set方法(IOC)
public void setService(Service service) {
this.service = service;
}
public void ok(){
service.ok();
}
}
二.构造器注入
构造函数的注入是指带着参数的构造器,eg:创建了两个成员变量,service和user,但是并没有设置对象的set方法.而是使用Action的带有两个参数的构造函数的方式注入.
public class Action {
//注入对象service和user
private Service service;
private User user;
//带有两个参数的有参构造器
public Action(Service service,User user){
this.service = service;
this.user = user;
System.out.println("构造方法调用service和user");
}
public void ok(){
user.setName("闫鑫");
service.save(user);
}
}
解决构造方法中的参数不确定性的问题,使用index来强制规定参数类型
三.静态工厂注入
先定义一个工厂类,不通过类.静态方法去获取对象.而是通过spring注入的形式获取.
public class DaoFactory {
//静态工厂
public static final FactoryDao getStaticFactoryDaoImpl(){
return new StaticFacotryDaoImpl();
}
}
然后创建Action
public class Action {
//注入对象
private FactoryDao staticFactoryDao;
public void staticFactoryOk(){
staticFactoryDao.saveFactory();
}
//注入对象的set方法
public void setStaticFactoryDao(FactoryDao staticFactoryDao) {
this.staticFactoryDao = staticFactoryDao;
}
}
在配置文件中,
指向的class并不是FactoryDao的实现类,而是指向静态工厂DaoFactory,并且配置 factory-method="getStaticFactoryDaoImpl"指定调用哪个工厂方法
四.实例工厂注入
获取对象实例的方法不是静态的
public class DaoFactory {
//实例工厂
public FactoryDao getFactoryDaoImpl(){
return new FactoryDaoImpl();
}
}
public class Action {
//注入对象
private FactoryDao factoryDao;
public void factoryOk(){
factoryDao.saveFactory();
}
public void setFactoryDao(FactoryDao factoryDao) {
this.factoryDao = factoryDao;
}
}
总结:
IOC注入,尽情的使用set注入即可,偶尔能用到构造器注入.
spring创建的对象都是单例的,如果需要创建多例对象,可以在
标签后面加一个属性.
