【 Spring 的 IOC 解决程序耦合 】
什么是 Spring?
Spring 是一个 开源框架,是于 2003 年兴起的一个 轻量级 的 Java 开发框架,其基础版本只有 2 MB 左右的大小。
Spring 框架目标是简化Java企业级应用开发,通过启用基于 POJO 编程模型来促进良好的编程实践。
Spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。然而,Spring 的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。
Spring 是一个轻量级的
控制反转(IoC)
和面向切面(AOP)
的 容器框架
使用 Spring 框架的好处是什么?
-
方便解耦,简化开发
:Spring 就是一个大工厂,专门负责生成 Bean,可以将所有对象创建和依赖关系维护由Spring 管理 -
AOP编程的支持
:Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能 -
声明式事务的支持
:只需要通过配置就可以完成对事务的管理,而无需手动编程 -
方便程序的测试
:Spring 对 Junit4 支持,可以通过注解方便的测试 Spring 程序 -
方便集成各种优秀框架
:Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的支持 -
降低JavaEE API的使用难度
:Spring 对 JavaEE 开发中一些难用的API(JDBC、JavaMail、远程调用 webservice 等),都提供了封装,使这些 API 应用难度大大降低
Spring 官网:https://spring.io/
官网 jar 包下载地址:https://repo.spring.io/release/org/springframework/spring/
或 https://repo.spring.io/libs-release-local/org/springframework/spring/
Spring 现在有很多框架,如 Spring、SpringMVC、Spring-Data、Sprint-Boot 等等。
jar 包说明
spring5 版本是用 jdk8 编写的,所以要求我们的 jdk版本是 8及以上。 同时 tomcat 的版本要求 8.5及以上。
对版本号的意义加以说明
-
Alpha
:
Alpha是内部测试版,一般不向外部发布,会有很多 Bug。除非你也是测试人员,否则不建议使用。是希腊字母的第一位,表示最初级的版本,alpha 就是α,beta 就是β ,alpha 版就是比beta还早的测试版,一般都是内部测试的版本。 -
Beta
:
该版本相对于α版已有了很大的改进,消除了严重的错误,但还是存在着一缺陷,需要经过多次测试来进一步消除。这个阶段的版本会一直加入新的功能。 -
RC
:(Release Candidate)
Candidate是候选人的意思,用在软件上就是候选版本。Release.Candidate.就是发行候选版本。和Beta版最大的差别在于Beta阶段会一直加入新的功能,但是到了RC版本,几乎就不会加入新的功能了,而主要着重于除错! RC版本是最终发放给用户的最接近正式版的版本,发行后改正bug就是正式版了,就是正式版之前的最后一个测试版。 -
GA
:(general availability)
比如:Apache Struts 2 GA这是Apache Struts 2首次发行稳定的版本,GA意味着General Availability,也就是官方开始推荐广泛使用了。 -
Release
:
该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本。该版本有时也称为标准版。一般情况下,Release不会以单词形式出现在软件封面上,取而代之的是符号®。
Spring 的核心 jar 包
-
spring-core
包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心。 -
spring-beans
所有应用都要用到的,它包含访问配置文件、创建和管理 bean 以及进行 Inversion of Control(IoC) / Dependency Injection(DI) 操作相关的所有类 -
spring-context
Spring 提供在基础 IoC 功能上的扩展服务,此外还提供许多企业级服务的支持,如邮件服务、任务调度、JNDI 定位、EJB 集成、远程访问、缓存以及各种视图层框架的封装等。 -
spring-expression
Spring 表达式语言 -
com.springsource.org.apache.commons.logging-1.1.1.jar
第三方的主要用于处理日志
入门实例
步骤一:创建一个 maven 项目,添加相应的依赖
导入4核心(beans、core、context、expression) + 1个依赖(common-logging.jar)
pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
步骤二:编写一个简单的 Dao
/**
* 账户的持久层接口
*/
public interface IAccountDao {
/**
* 模拟保存账户
*/
void saveAccount();
}
/**
* 账户的持久层实现类
*/
public class AccountDaoImpl implements IAccountDao {
public void saveAccount(){
System.out.println("保存了账户");
}
}
步骤三:编写一个简单的 Service
/**
* 账户业务层的接口
*/
public interface IAccountService {
/**
* 模拟保存账户
*/
void saveAccount();
}
/**
* 账户的业务层实现类
*/
public class AccountServiceImpl implements IAccountService {
private IAccountDao accountDao ;
public AccountServiceImpl(){
System.out.println("对象创建了");
}
public void saveAccount(){
accountDao.saveAccount();
}
}
步骤四:传统方式调用
AccountDao userService = new AccountDaoImpl();
步骤五:使用 Spring IoC 控制反转 创建实例
① 编写 Spring 的核心 xml 配置文件,可以取名为:beans.xml
配置文件的约束可以访问:/spring-framework-5.0.2.RELEASE/docs/spring-framework-reference/html5/core.html
网页查看
上面的地址是联网的地址,如果离线编写程序,需要离线配置文件约束提示的配置。
获取离线配置文件约束的方式为:打开 联网的地址 ,例如:http://www.springframework.org/schema/beans/spring-beans.xsd ,鼠标右键 另存为 文件名为 spring-beans.xsd 。
</beans>
<?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">
<!-- bean 标签:用于配置让 spring 创建对象,并且存入 ioc 容器之中
id 属性:对象的唯一标识。
class 属性:指定要创建对象的全限定类名
-->
<!--把对象的创建交给spring来管理-->
<bean id="accountService" class="cn.ys.service.impl.AccountServiceImpl"></bean>
<bean id="accountDao" class="cn.ys.dao.impl.AccountDaoImpl"></bean>
</beans>
② 读取 Spring 的配置文件来获取 Bean
【 Bean 其实就是一个 new 好的对象】
/**
* 模拟一个表现层,用于调用业务层
*/
public class Client {
/**
* 获取spring的Ioc核心容器,并根据id获取对象
*
* @param args
*/
public static void main(String[] args) {
//1.获取核心容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2.根据id获取Bean对象
IAccountService as = (IAccountService)ac.getBean("accountService");
IAccountDao adao = ac.getBean("accountDao", IAccountDao.class);
System.out.println(as);
System.out.println(adao);
as.saveAccount();
}
}
控制台打印
[AAA, BBB, CCC]
[AAA, BBB, CCC]
[AAA, BBB, CCC]
{testD=ddd, testC=ccc}
{testA=aaa, testB=BBB}