Spring
什么是Spring
Spring是一个开源的一站式轻量级开发框架。它以Ioc(控制反转)和AOP(面向切面)为核心,使用基本的javaBean来完成以前只能由EJB完成的工作,取代了EJB的臃肿、低效的开发模式。
对Spring的说明:Spring是javaEE应用层中的解决方案,在表现层提供了SpringMVC以及Struts框架的整合功能;在业务层可以管理事务,记录日志等;在持久层可以整合MyBatis、Hibernate、JdbcTemplate等技术,所以说,Spring是一个企业级开发很好地一个”一站式”开发框架。Spring贯穿表现层,业务逻辑层和持久层
Spring框架的优点
Spring具有简单、可测试和松耦合等特点,Spring不仅开发用于服务器端的开发,也可以应用于任何java应用的开发。总结一下Spring的优点:
- 非侵入式设计
Spring是一种非侵入式框架,它可以使应用程序代码对框架的依赖最小化
- 方便解耦、简化开发
Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给Spring容器管理,大大降低了组件之间的的耦合性。
- 支持AOP
Spring提供了对AOP的支持,它允许将一些通用任务,如安全、事务、日志等进行集中式处理,从而提高了程序的复用性
- 支持声明式事务处理
只需要通过配置就可以完成对事务的管理,而无须手动编程
- 方便程序测试
Spring提供了Junit4的支持,可以通过注解方便的测试Spring程序
- 方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持。
Spring的体系结构
Spring框架采用的是分层架构,功能模块有20多个
1、Core Container(核心容器)
Spring的核心容器是其他模块建立的基础,它由Beans模块,Core模块,Context模块,Context-support模块和SpEL模块组成
Beans模块:提供了BeanFactory,是工厂模式的经典实现。Spring将管理对象称为Bean
Core核心模块:提供了框架的基本组成部分,包括Ioc(控制反转)和DI(依赖注入)功能
Context上下文模块:建立在core和beans模块基础之上,它是访问定义和配置的任何对象的媒介
Context-support模块:提供了对第三方库嵌入Spring应用的集成支持
2、数据集成/访问
JDBC模块:提供了一个JDBC的抽象层,减少代码量
ORM模块:
Transactions事务模块:支持对实现特殊接口以及所有POJO类的编程和声明式事务的管理
3、WEB
Servlet模块:
进入Spring入门程序编写:
Spring的下载及目录结构
Spring的第一个版本是在2004年发布,
Spring4.3.6版本,名称:spring-framework-4.3.6.RELEASE-dist.zip
里面包含了jar包和源码
Jar包用于开发 源码用于观看底层源代码
docs文件夹中包含了Spring的API文档和开发规范
libs文件夹中包含开发需要的jar包和源码,
schema文件夹中包含开发所需要的schema文件,在该文件中定义了有关配置文件的约束
入门程序:
- 导入jar包:
2、引入配置文件
- 编写源代码(建包建类)
- 编写UserDao接口中的代码:
public interface UserDao {
public void say();
}
- 编写UserDaoImpl实现类中的代码:
public class UserDaoImpl implements UserDao {
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("Hello Spring...");
}
}
- 编写配置文件中的代码;
<!-- 将指定类配置给Spring,让Spring创建其对象的实例 -->
<bean id="UserDao" class="com.bdqn.cn.dao.UserDaoImpl" />
- 编写测试类中的代码:
public class testDemo {
@Test
public void method(){
// 通过实例化对象调用方法
// UserDao ud = new UserDaoImpl();
// ud.say();
// 1、初始化Spring容器,加载配置文件
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2、通过容器获取userDao实例
UserDao ud = (UserDao) app.getBean("UserDao");
// 3、调用该方式进行测试
ud.say();
}
}
ApplicationContext的解析:
/*
* ApplicationContext 表示应用上下文,是Spring中常用的核心容器
* 是一个接口
* 通过ClassPathXmlApplicationContext创建
* ClassPathXmlApplicationContext会从类路径classPath中寻找指定的XML配置文件,找到并加载完成ApplicationContext
* 的实例化操作
*/
依赖注入:
依赖注入(Dependency Injection,简称DI)与控制反转(Ioc)的含义相同
控制反转:在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制,这样控制权由应用程序转移到了Spring容器,控制权发生了反转,这就是Spring的控制反转
从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入
依赖注入的实现方式:
- 属性setter方法注入
建包建类:
编写userService接口代码:
public interface UserService {
public void say();
}
编写userServiceImpl实现类代码:
public class UserServiceImpl implements UserService {
// 这里是声明 没有具体的值 所以需要给它赋值
private UserDao userDao;
// 给userDao传入参数
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void say(){
// TODO Auto-generated method stub
this.userDao.say();
System.out.println("userService hello userDao...");
}
}
编写测试类代码:
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService us = (UserService)app.getBean("userService");
us.say();
2、构造方法注入
编写userServiceImpl代码
public class UserServiceImpl implements UserService {
// 这里是声明 没有具体的值 所以需要给它赋值
private UserDao userDao;
// 构造函数传参
public UserServiceImpl(UserDao userDao) {
super();
this.userDao = userDao;
}
}
编写配置文件中的代码:
<!-- 构造函数注入 -->
<bean id="userService" class="com.bdqn.cn.service.UserServiceImpl">
<constructor-arg index="0" ref="UserDao" />
</bean>
编写测试类:
@Test
public void method2(){
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService us = (UserService)app.getBean("userService");
us.say();
}