Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架
一站式框架:有Java EE开发的每一层的解决方案
- WEB层 :SpringMVC
- Service层 :Spring的Bean管理,Spring编程式、声明式事务
- DAO层 Spring的Jdbc模板,Spring的ORM模块
- 方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
- AOP的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
- 声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
- 方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
- 方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
- 降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
http://spring.io/
- docs :Spring的开发规范和API
- libs :Spring的开发的jar和源码
- schema :Spring的配置文件的约束
在lib中引入6个基本包:
- spring-core-4.2.4.RELEASE.jar
- spring-beans-4.2.4.RELEASE.jar
- spring-context-4.2.4.RELEASE.jar
- spring-expression-4.2.4.RELEASE.jar
- com.springsource.org.apache.commons.logging-1.1.1.jar(Apace提供的日志记录的接口)
- com.springsource.org.apache.log4j-1.2.15.jar
前四个包对应着下图红框所示的四个core Container
6个基本jar包的路径为:
spring-framework-4.2.4.RELEASE-dist\spring-framework-4.2.4.RELEASE\libs(前四个包的路径)
spring-framework-3.0.2.RELEASE-dependencies\org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1
spring-framework-3.0.2.RELEASE-dependencies\org.apache.log4j\com.springsource.org.apache.log4j\1.2.15
package com.itykd.dao;
public interface UserDao {
public void save();
}
package com.itykd.dao;
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("UserDaoImpl的save方法执行了....");
}
}
在spring的解压路径下spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html,找到
the beans schema(bean约束)
package com.itykd.spring;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.itykd.dao.UserDao;
public class SpringDemo {
@Test
public void StartSringIOC() {
//创建Spring的工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.save();
}
}
控制反转,将对象的创建权反转给了Spring
依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来
传统的面向对象和面向接口的方式在切换底层的时候需要修改源代码,比如以面向接口编程为例:
比如UerDao接口有两个实现类,分别是UserDaoImpl和UserDaoHibernateImpl,假设一开始我们选择的实现类是UserDaoImpl,那么当我们需要切换成Hibernate实现的时候需要将UserDao userDao = new UserDaoImpl()改成UserDao userDao = new UserDaoHibernateImpl(),如果修改的地方很多会很不方便;
我们都知道,Spring利用IOC管理对象的创建,那么这里简单介绍IOC的底层原理:工厂+反射+配置文件
Spring用BeanFactory来减少接口和抽象类的耦合
如下代码所示:Spring利用工厂模式使接口和实现类之间没有耦合,但是接口和工厂有耦合,而UserDao和CustomerDao都有两种实现方式,当我们想要选择不同的实现类时,仍然需要一个个地修改代码
package com.itykd.spring;
import com.itykd.dao.UserDao;
import com.itykd.dao.impl.CustomerDaoHibernateImpl;
import com.itykd.dao.impl.UserDaoHibernateImpl;
public class BeanFactory {
public static UserDao getUserDao(){
//实现方式1:
//return new UserDaoImpl();
//实现方式2:
return new UserDaoHibernateImpl();
}
public static UserDao getCustomerDao(){
//实现方式1:
//return new CustomerDaoImpl();
//实现方式2:
return new CustomerDaoHibernateImpl();
}
}
首先解析配置文件,根据参数id找到对应的类路径,并利用反射加载在配置文件中的class,然后生成类的实例;
public class BeanFactory {
public static Object getBean(String id){
//该方法首先解析XML文件
//然后用反射生成对象
Class clazz = Class.forName(UserDaoImpl.class);
return clazz.newInstance();
}
}