概述
Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。
Spring 框架是一个开源的 Java 平台,它最初是由 Rod Johnson 编写的,并且于 2003 年 6 月首次在 Apache 2.0 许可下发布。
Spring 是轻量级的框架,其基础版本只有 2 MB 左右的大小。
Spring 框架的核心特性是可以用于开发任何 Java 应用程序,但是在 Java EE 平台上构建 web 应用程序是需要扩展的。 Spring 框架的目标是使 J2EE 开发变得更容易使用,通过启用基于 POJO 编程模型来促进良好的编程实践。
1、什么是Spring
Spring是一个开源框架,最早由Rod Johnson创建。Spring是为了解决企业级应用开发的复杂性而创建的,使用Spring可以让简单的JavaBean实现之前只有在EJB才能完成的事情。但Spring不仅仅局限于服务器端开发,任何Java应用都能在简单性、可测试性和松耦合等方面从Spring中获取收益(面向Bean的编程)。
2、为什么要使用Spring
Spring最根本的使命,简化Java开发。这是一个郑重的承诺,许多框架都声称在某些方面做了优化,但Spring的目标是致力于全方位的简化Java开发。
为了降低Java开发的复杂性,Spring采取了以下四种关键策略:
基于POJO的轻量级和最小侵入性编程Student
通过依赖注入和面向接口编程实现松耦合
基于切面和惯例进行声明式编程
通过切面和模板减少样式代码
3、企业级系统的特征
大规模:用户数量多、数据规模大、功能众多
性能和安全要求高
业务复杂
灵活应变
4、Spring的体系结构
Spring的三大核心技术:
控制反转(IOC:Inversion of Control)
依赖注入(DI:Dependency Injection)
面向切面编程(AOP:Aspect Oriented Programming)
控制反转:
什么是IOC:这么讲吧,一个系统的运作肯定不是简单的几个类就可以实现的,它 往往需要多个类的合作来实现业务逻辑。这就使得每个对象都需要与其合作的对象具有 相互的关系(依赖关系)。在早前编程中所需要的依赖对象是通过自身去创建得到的, 而现在是通过一个容器来统一管理这些依赖关系。在这整个过程中,对象获得其他对象 引用的方式其实就是IOC。
IOC的本质:控制权的转移。IoC原理是基于面向对象中的设计原则的Don't call us,we'll call you。可以这样讲,所有组件的初始化和调用都是由容器负责。在传统实现中类之间的关系是由类自己控制的(需要使用其他类时就自己创建),但是在IoC中,组件处在容器中,由容器统一管理和调度。这就是"控制反转"的概念所在:控制权由应用代码转移到了容器中,即控制权的转移。
依赖注入:
依赖注入的本质:上面说到控制反转IOC,是一个思想概念,但是也要具体实现的,上面的配置文件也是一种实现方式。依赖注入提出了具体的思想。
依赖注入DI是Dependency Injection缩写,它提出了“哪些东东的控制权被反转了,被转移了?”,它也给出了答案:“依赖对象的创建获得被反转”。所谓依赖注入,就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。
面向切面编程:
面向切面编程的本质:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来。
1主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等。
2主要意图:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
5.Spring的例子
1.创建Maven工程
创建Maven,导入依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.2.0.RELEASE</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.7</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.7.0</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>1.2.3</version> </dependency>
创建entity
创建StudentIoc,TeacherIoc
public class StudentIoc {
private Integer Stu_id;
private String Stu_name;
private TeacherIoc teacher;
public void say(){
System.out.println("大家好我的编号为:"+Stu_id+"我的姓名是:"+Stu_name+"我的导师是"+teacher.getT_name());
}
}
public class TeacherIoc {
private Integer t_id;
private String t_name;
}
创建Spring配置文件--applicationContext.xml
该文件位于resources(自行创建)目录下
<?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"> <!--将Person类交给Spring容器管理(包括:实例化和给属性赋值) id:bean对象的唯一标识 class:bean的全类名 property:Person类的属性(可赋值) -->
<bean id="studentIoc" class="com.wdkseft.entity.StudentIoc">
<!--name:通过Person类中的属性名赋值-->
<property name="Stu_name" value="辨识度"></property>
<property name="Stu_id" value="16"></property>
<property name="teacher" ref="teacherIoc"></property>
</bean>
<bean id="teacherIoc" class="com.wdkseft.entity.TeacherIoc">
<!--name:通过Person类中的属性名赋值-->
<property name="t_id" value="16"></property>
<property name="t_name" value="温柔的电"></property>
</bean>
</beans>
创建测试代码
public void SpringIOC(){
//步骤一:加载applicationContext.xml大配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//步骤二:获取bean
StudentIoc studentIoc = (StudentIoc) ctx.getBean("studentIoc");
studentIoc.say();
}
打印机案例
/**
* 墨盒的接口
*/
public interface ink {
//获取墨盒颜色
String getInk();
}
/**
* 彩色墨盒
*/
public class ColorInk implements ink
{
@Override
public String getInk() {
return "彩色";
}
}
/**
* 黑白墨盒
*/
public class GrayInk implements ink {
@Override
public String getInk() {
return "黑白";
}
}
/**
* 纸张
*/
public interface Paper {
String getPaper();
}
/**
* A4纸张
*/
public class A4Paper implements Paper {
@Override
public String getPaper() {
return "A4";
}
}
/**
* B5纸张
*/
public class B5Paper implements Paper {
@Override
public String getPaper() {
return "B5";
}
}
/**
* 打印机
*/
public class Printer {
//纸张对象
private Paper paper;
private ink ink;
//打印方法
public void prints(){
System.out.println("您正在使用:"+paper.getPaper()+"纸张和"+ink.getInk());
}
}
<!--彩色盒子--> <bean id="colorInk" class="com.wdkseft.print.ink.ColorInk"></bean> <!--黑白盒子--> <bean id="grayInk" class="com.wdkseft.print.ink.GrayInk"></bean> <!--A4纸张--> <bean id="a4Paper" class="com.wdkseft.print.ink.paper.A4Paper"></bean> <!--B5纸张--> <bean id="b5Paper" class="com.wdkseft.print.ink.paper.B5Paper"></bean> <!--打印机--> <bean id="printer" class="com.wdkseft.print.ink.printer.Printer"> <property name="ink" ref="colorInk"></property> <property name="paper" ref="a4Paper"></property> </bean>
@Test
public void PrintTest(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Printer printer = (Printer) ctx.getBean("printer");
printer.prints();
}