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创建的对象都是单例的,如果需要创建多例对象,可以在 标签后面加一个属性.