Spring的核心思想是什么?
Spring整个系列的最最核心的概念当属IoC, AOP。
sping IOC原理
IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了”主从换位”的变化。
传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试; 有了IoC容器后, 把创建对象和查找依赖对象的控制权交给了容器, 由容器进行注入组合对象, 通过容器管理对象的生老病死,所以对象与对象之间是松散耦合, 这样也方便测试, 利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活. 将对象创建过程从编译时延期到运行时,即通过配置进行加载,这样一来就解决了不用编译后期选择具体实现,其实就是面向对象的核心理念,针对接口编程。IoC开始就是个factory加上依赖管理罢了,这样一来,一个系统的创建过程就从原先的new改为配置组装,内部通过注入解决了依赖关系,只要满足接口协议即插即用。通过IoC, AOP事实上形成了一个套路,通过这个套路完成了系统的整合。所以Spring并没有说自己写一个ORM,而是用统一的套路完成了多个ORM的集成,这也是Spring越做越大的基础,慢慢就形成了Spring Way,其实这个才是Spring最有价值的地方。
通过容器进行获取对象时的具体实现:
public class BeanFactory{
private static final Map<String,Object> pool=new HashMap<>();
public static Object getBean(String key){}
}
当启动Spring框架时,BeanFactory类会自动查找并解析核心配置文件(applicationContext.xml),按照xml文件中的配置使用反射机制创建class所指定的对象类对象,并采用id配置值作为key存放在map容器中;以后需要使用对象时,不是自行编码创建,而是向容器进行获取getBean.
Beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="userDao" class="com.yan.props.OracleUserDao"/>
<bean id="now" class="java.util.Date"/>
</beans>
DaoFactory.java
package com.yan.xml;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/*
* 工厂类需要将xml文件进行解析,然后构建class所指定的类对象【反射】,并以id作为key值,存放在一个容器中。
* 当后面需要使用某个对象时,按照id命名从容器中获取对应的对象
*/
public class DaoFactory {
private static final Map<String, Object> pool = new HashMap<>();
static {
try {
SAXParserFactory fac = SAXParserFactory.newInstance();
SAXParser parser = fac.newSAXParser();
parser.parse("src/main/java/beans.xml", new DefaultHandler() {
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
if ("bean".equals(qName)) {
String id = attributes.getValue("id");
String clz = attributes.getValue("class");
Object obj;
try {
obj = Class.forName(clz).newInstance();
pool.put(id, obj);
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
throw new SAXException(e);
}
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public static Object getBean(String id) {
if(pool.containsKey(id))
return pool.get(id);
return null;
}
}
Test.java
package com.yan.xml;
import java.util.Date;
import com.yan.props.IUserDao;
public class Test {
public static void main(String[] args) {
IUserDao userdao = (IUserDao) DaoFactory.getBean("userDao");
userdao.create();
Date now = (Date) DaoFactory.getBean("now");
System.out.println(now);
}
}