Spring解耦原理: 利用简单工厂模式降低耦合
1)什么是耦合:
耦合是程序之间的依赖程度。
2)什么是解耦:
降低程序之间的耦合关系,耦合程度只能降低,不能消除。
宗旨:编译时不依赖,运行时才依赖。
例如: Class.forName(“com.mysql.jdbc.Driver”);
"com.mysql.jdbc.Driver"在编译时对程序而言只是字符串,运行才依赖com.mysql.jdbc.Driver的程序代码。
一:工厂模式(简单工厂模式、工厂方法模式和抽象工厂模式)
简单工厂模式不符合开闭原则,(对扩展开放,对修改关闭)
什么是工厂模式?
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。
解耦思路:
1)把全局类名放到配置文件中。(beans.xml)
2)把创建实例对象的过程转交工厂类实现。(基于Java反射原理/简单工厂模式)
1)beans.xml
<beans>
<bean id="userServiceImpl" class="service.impl.UserServiceImpl"></bean>
</beans>
2)建立工厂类:
public class BeanFactory {
private static Map<String ,Object> map = new HashMap<String ,Object>();
static{
InputStream inputStream = BeanFactory.class.getResourceAsStream("/beans.xml");
//解析xml获取xml中所有的信息
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(inputStream);
Element rootElement = doc.getRootElement();
List<Element> elements = rootElement.elements();
for (Element element : elements){
String id = element.attributeValue("id");
String className = element.attributeValue("class");
//通过className全限类名创建对象--获取字节码
Class clazz = Class.forName(className);
//通过反射创建对象
Object obj = clazz.newInstance();
//存储在Map集合中
//key: id
//value:obj
map.put(id ,obj);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//需要实现的功能,传入一个名字,获取一个Bean对象
public static Object getBean(String name){
return map.get(name);
}
}
创建实例对象:
UserServiceImpl userService = (UserServiceImpl)BeanFactory.getBean("userServiceImpl");
优点:把实例化的过程转交给工厂类来实现,降低了程序之间的耦合关系,如果删除了userServiceImpl对象的类,BeanFactory.getBean(“userServiceImpl”); 不会出现错误,而是出现异常。
(java.lang.ClassNotFoundException: service.impl.UserServiceImpl
at java.net.URLClassLoader.findClass(URLClassLoader.java:381))
没有通过工厂类创建对象的情况下一般是通过new关键字实例化对象,如果在项目里删除UserServiceImpl类,会造成程序出现错误,无法执行。
UserServiceImpl userService = new UserServiceImpl();