简述
声明:
以下内容综合个人理解,如有歧义,麻烦帮忙指出,共同学习,查漏补缺
------------------------------------------------------------------------------------------------------------------------
Spring简述:
spring是分层的、也是属于一站式、轻量级的开源框架(相对于EJB)
分层、一站式:它可以提供从客户端到后端的一套体系,也可以分开与现有主流框架整合、兼容。
轻量级:并不依赖于其他的API和容器,相对于一些需要集成一堆API和依赖容器的框架而言是轻量的。
对事务的支持:通过切面编程,仅需配置就可以实现。
对一些API封装:例如邮件mail,远程调度。
spring容器:
spring框架对对象的处理是使用的最多的一个方式,也就是依赖注入(DI)与切面编程(AOP),两点也是其核心思想部分了。
可能还有人提及到控制反转(IoC),其实我认为不需要纠结。它们的含义可以是包含的,都是不由调用者来创建对象。
<1>依赖注入:将创建对象交给spring来处理,并将对象通过get/构造注入到指定的对象内
<2>控制反转:将创建对象交给其他容器或工厂处理
这里推荐一个依赖注入和控制反转详解比较清晰的网站:http://zhangjunhd.blog.51cto.com/113473/126530/
模拟Ioc
究竟Ioc是怎么实现的呢,这里利用xml结合代码模拟
以UserDao为例,使用spring.xml ---beans的约束
xml
<?xml version="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="sha"class="UserDao"></bean>
</beans>
UserDao代码
public class UserDao {
publicUserDao() {
}
publicstatic void sha(){
System.out.println("555");
}
}
模拟工厂类
//工厂类
public class BeanFactory {
//使用一个全家的map的保存我们new出来的对象
private static Map<String, Object>beanMap = new HashMap<String, Object>();
//解析spring.xml文件
static{
SAXReader sax = new SAXReader();
try {
//读取xml配置文件
Document read =sax.read(BeanFactory.class.getResourceAsStream("/spring.xml"));
//获取根标签
Element rootElement =read.getRootElement();
//再获取子标签
List<Element> elements =rootElement.elements();
//迭代子标签
for (Element element : elements) {
String id = element.attributeValue("id");
String className =element.attributeValue("class");
//通过反射技术生成对象
Object obj =Class.forName(className).newInstance();
//再把生成的对象放入map中
beanMap.put(id, obj);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//返回通用对象
public static Object getBean(String id){
return beanMap.get(id);
}
First Demo
jar包获取:http://spring.io
相应maven获取 :maven.org
这里使用jar包:
基本包
其他包
不放会出现以下异常:
NoClassDeFoundError
(没有导入日志包)
1、 准备javaBean
//这个就是JavaBean
public class User {
}
2、准备spring的核心配置文件
位置:建议放在src下
名称:建议 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- spring IOC的入门 -->
<bean id="u1" class="cn.itcast.a_springioc_helloworld.User"/>
</beans>
3、测试
//入门程序
public class Demo1 {
@Test
public void test1(){
//1、读取配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
//2、获取JavaBean,传入的参数是我们定义的额JavaBean的id。
User bean = (User)context.getBean("u1");
//3、输出JavaBean
System.out.println(bean);
}
}
现在的核心API
ApplicationContext: 接口
*ClassPathXmlApplicationContext 类,读取类路径的配置文件【推荐】
*FileSystemXmlApplicationContext 类,读取文件系统的配置文件
public void test2(){
//1、读取类路径的配置文件
/*ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml");
//2、读取文件系统的配置文件
//2.1 相对路径 . .. 这个. 代表当前项目,可以省略
//ApplicationContext context = new FileSystemXmlApplicationContext("./src/applicationContext.xml");}
原有的API
(BeanFactory工厂是Spring框架早期的创建Bean对象的工厂接口)使用BeanFactory接口也可以获取到Bean对象
public void run(){
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
UserService us = (UserService) factory.getBean("us");
us.sayHello();
}
BeanFactory和ApplicationContext的区别
*
BeanFactory --
BeanFactory采取延迟加载,第一次getBean时才会初始化Bean
*
ApplicationContext -- 在加载applicationContext.xml时候就会创建具体的Bean对象的实例,还提供了一些其他的功能
额外功能
* 事件传递
* Bean自动装配
* 各种不同应用层的Context实现