个人理解,Ioc其实是一种设计思想,在类的相互调用的时候我们会使用new 这个关键字来创建一个对象,从而达到使用这个对象的目的,它可以是持久层对象,业务层对象,那么当我们在每次需要一个对象的时候如果使用new 去创建对象的话那么就会很麻烦,并且代码模块之间的耦合度就会很高,就是说每一个模块和其他模块的联系是非常密切,如果当我们维护项目的时候需要修改代码的时候就会显得非常的棘手,ioc是一种设计思想,它就是把创建对象的工作拿到,由它来创建对象,并不是让我们来创建对象
使用工厂模式来模拟一个Spring ioc的容器
这是这个demo的一个整体的样子,dao层一个接口,dao.impl是一个实现接口的类,service层一个接口,service.impl是实现接口的一个业务类
package com.lyc.dao; public interface Userdao { public void save(); }
ackage com.lyc.dao.impl; import com.lyc.dao.Userdao; public class UserdaoImpl implements Userdao { @Override public void save() { System.out.println("这是张三"); } }
package com.lyc.service; public interface Userservice { public void save(); }
package com.lyc.service.impl; import com.lyc.dao.Userdao; import com.lyc.factory.BeanFactory; import com.lyc.service.Userservice; public class UserserviceImpl implements Userservice { //Userdao userdao=new UserdaoImpl(); private Userdao userdao=(Userdao) BeanFactory.getBean("Userdao"); @Override public void save() { userdao.save(); } }
如果不用ioc这个容器的话,每次在serviceImpl这个类中调用dao层的东西的时候,我们就要去new 一个dao层的对象 Userdao userdao=new UserdaoImpl() 像这样,这样会非常的麻烦,然后使用beans.perporties这个文件,我们把我们需要的东西放进去,,
然后写一个beansFactory的类来加载这个文件。
package com.lyc.factory; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class BeanFactory { private static Properties props=new Properties(); static{ InputStream in=BeanFactory.class.getResourceAsStream("/beans.perporties"); try { props.load(in); } catch (IOException e) { e.printStackTrace(); System.out.println("加载bean文件失败"); } } public static Object getBean(String name){ String className=props.getProperty(name); try { //反射构造对象 return Class.forName(className).newInstance(); } catch (Exception e) { e.printStackTrace(); } return null; } }
这个文件的作用就是解析benas.properties这个文件中的对象,在Action这个模拟测试类中可以通过BeanFactory.getBean()这个方法来调用我们需要的实体类,因为传递了一个String字符串的参数进去,所以我们可以随意调用需要的类的名字
package com.lyc.Action; import com.lyc.factory.BeanFactory; import com.lyc.service.Userservice; public class Action { public static void main(String[] args) { //Userservice userservice=new UserserviceImpl(); Userservice userservice=(Userservice) BeanFactory.getBean("Userservice"); userservice.save(); } }
打印这个测试的结果
这个时候我们需要调用第二个方法,就只需要改变beans.properties里的文件名,
UserdaoImpl2中方法的结果是另一个,也相当于在开发中第的二个或者其他方法,打印结果
并没有修改代码,只是修改了beans.properties里文件的名字,就达到了效果。
用工厂模式创建对象,我们需要这个对象的时候直接去这个beanFactory里面拿就ojbk了,不需要再去new 或者创建对象