什么是Spring
Spring是分层的JavaSE/EE full-stack 轻量级开源框架,以IoC(Inverse of Control控制反转)和AOP(Aspect Oriented Programming面向切面编程)为内核,使用基本的JavaBean来完成以前只可能由EJB完成的工作,取代了EJB的臃肿、低效的开发模式。 在实际开发中,通常服务器端在采用三层体系架构,分别为表示层(Web)、业务逻辑层(Service)、持久层(Dao), Spring对每一层都提供了技术支持。
Spring的体系结构
Core Container(核心容器):
Beans:提供了BeanFactory,Spring将管理对象称为Bean
Core:提供了Spring框架的基本组成部分,包括IoC和DI功能
Context:建立在Core和Beans模块的基础上,他是访问、定义和配置的任何对象的媒介
SpEL:Spring3.0后新增的模块,是运行时查询和操作对象图的强大的表达式语言
Data Access/Integration(数据访问/继承):
JDBC:提供一个JDBC的抽象层,大幅度的减少了在开发过程中对数据库操作的编码
ORM:对流行的对象关系的映射API,包括JPA、JDO和Hibernate提供了集成层支持
Transactions:支持对实现特殊接口以及所有POJO类的编程和声明式的事务管理
Web:
Servlet:也成为Spring-webmvc模块,包含Spring模型--视图--控制器(MVC)和RESTWeb Services 实现的Web程序
Web:提供了基本的Web开发集成的特性,如:多文件上传、使用servlet监听器来初始化Ioc容器以及Web应用上下文
其他:
AOP:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性
Aspects:提供了与AspectJ的集成功能,AspectJ是一个功能强大且成熟的面向切面编程(AOP)框架
如图所示:

接下来通过一个入门程序来展示Spring的基本用法:
- 编写接口类和接口实现类
public interface UserDao(){
public void say();
}
public class UserDaoImpl implement UserDao(){
@Override
public void say(){
System.out.println("hello world!");
}
}
- 在applicationContext.xml中进行如下配置:
<!-- 将指定类配置给spring,让spring创建对象的实例 -->
<bean id="userDao" class="com.mq.ioc.UserDaoImpl"></bean>
- 最后编写测试类:
//1、初始化spring容器,加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
//2、通过容器获取UserDao实例
UserDao userDao=(UserDao)applicationContext.getBean("userDao");
//3、调用实例方法
userDao.say();
- 控制台打印出结果:
又是熟悉的hello world!
第二个案例:依赖注入的实现方法
- 编写接口类和接口实现类
public interface UserService {
public void say();
}
public class UserServiceImpl implements UserService {
// 声明UserDao属性
private UserDao userDao;
// 添加UserDao属性的setter方法,用于实现依赖注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void say() {
// 调用userDao中的say方法
this.userDao.say();
System.out.println("userService say hi");
}
}
- 在spring配置文件中进行如下配置
<!-- 添加一个id为userService的实例 -->
<bean id="userService" class="com.mq.ioc.UserServiceImpl">
<!-- 将id为userDao的bean实例注入到userService实例中 -->
<!-- name是类中属性的名字,ref是所依赖的bean的id -->
<property name="userDao" ref="userDao"></property>
</bean>
在UserService中声明UserDao属性并为其添加setting方法,spring容器先自动实例化userService,并将上面已经进行实例化的userDao实例注入到userService实例中。所以在userService的say()方法中可以直接使用userDao实例。
- 编写测试类:
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService=(UserService)applicationContext.getBean("userService");
userService.say();
4.运行结果:
