Spring核心技术详解

    • 方便解耦,简化开发,通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码造成的程序耦合度高。
  • AOP编程的支持,通过Spring提供的AOP功能,方便进行面向切面编程。

  • 声明式事务的支持,在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。

  • 方便程序的测试,可以用非容器依赖的编程方式进行几乎所有的测试工作。

  • 方便集成各种优秀框架,Spring提供了对各种优秀框架的直接支持。

二、Spring体系结构


如下图所示,整个spring框架按其所属功能可以划分为五个主要模块,这五个模块几乎为企业应用提供了所需的一切,从持久层、业务层到表现层都拥有相应的支持,这就是为什么称Spring是一站式框架的原因。

核心模块(Core Container)

Spring的核心模块实现了IoC的功能,它将类和类之间的依赖从代码中脱离出来,用配置的方式进行依赖关系描述。由IoC容器负责类的创建,管理,获取等。BeanFactory接口是Spring框架的核心接口,实现了容器很多核心的功能。

Context模块构建于核心模块之上,扩展了BeanFactory的功能,包括国际化,资源加载,邮件服务,任务调度等多项功能。ApplicationContext是Context模块的核心接口。

表达式语言(Expression Language)是统一表达式语言(EL)的一个扩展,支持设置和获取对象属性,调用对象方法,操作数组、集合等。使用它可以很方便的通过表达式和Spring IoC容器进行交互。

AOP模块

Spring AOP模块提供了满足AOP Alliance规范的实现,还整合了AspectJ这种AOP语言级的框架。通过AOP能降低耦合。

数据访问集成模块(Data Access/Integration )

该模块包括了JDBC、ORM、OXM、JMS和事务管理:

  • 事务模块:该模块用于Spring管理事务,只要是Spring管理对象都能得到Spring管理事务的好处,无需在代码中进行事务控制了,而且支持编程和声明性的事务管理。

  • JDBC模块:提供了一个JBDC的样例模板,使用这些模板能消除传统冗长的JDBC编码还有必须的事务控制,而且能享受到Spring管理事务的好处。

  • ORM模块:提供与流行的“对象-关系”映射框架的无缝集成,包括hibernate、JPA、MyBatis等。而且可以使用Spring事务管理,无需额外控制事务。

  • OXM模块:提供了一个对Object/XML映射实现,将Java对象映射成XML数据,或者将XML数据映射成java对象,Object/XML映射实现包括JAXB、Castor、XMLBeans和XStream。

  • JMS模块:用于JMS(Java Messaging Service),提供一套“消息生产者、消息消费者”模板用于更加简单的使用JMS,JMS用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

Web模块

该模块建立在ApplicationContext模块之上,提供了Web应用的功能,如文件上传、FreeMarker等。Spring可以整合Struts2等MVC框架。此外,Spring自己提供了MVC框架Spring MVC。

测试模块

Spring可以用非容器依赖的编程方式进行几乎所有的测试工作,支持JUnit和TestNG等测试框架。

三、初识Ioc与DI


我们首先来讲解一下IoC的概念。IoC(控制反转:Inverse of Control)是Spring容器的核心,但是IoC这个概念却比较晦涩,让人不太容易望文生义。

1、IoC控制反转和DI依赖注入

传统程序设计中,我

User user=new User(); user.setName("jack");

  • 使用接口注入

// 将调用类所有依赖注入的方法抽取到接口中,调用类通过实现该接口提供相应的注入方法

public interface Dao{ public void delete(String name); } public class DapIml implements Dao{ private String name; public void delete(String name){ this.name=name; } }

通过容器完成依赖关系的注入

上面的注入方式都需要我们手动的进行注入,如果有一个第三方容器能帮助我们完成类的实例化,以及依赖关系的装配,那么我们只需要专注于业务逻辑的开发即可。Spring就是这样的容器,它通过配置文件或注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入的工作。

3、Spring的IoC例子

(1) 创建工程,导入jar包

这里我们只是做IoC的操作,所以只需要导入核心模块里的jar包,beans、core、context、expression等。因为spring中并没有日志相关的jar包,所以我们还需要导入log4j和commons-logging。

(2) 创建一个类

public class User { public void add(){ System.out.println("add....."); } }

(3) 创建一个xml配置文件

<?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 id="user" class="com.cad.domain.User"/> </beans>

(4) 进行测试

//这只是用来测试的代码,后期不会这么写 public class Test { @org.junit.Test public void test(){ //加载配置文件 ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml"); //获取对象 User user=(User) context.getBean("user"); System.out.println(user); //调用方法 user.add(); } }

在容器启动时,Spring会根据配置文件的描述信息,自动实例化Bean并完成依赖关系的装配,从容器中即可获得Bean实例,就可以直接使用。Spring为什么仅凭一个简单的配置文件,就能神奇的实例化并配置好程序使用的Bean呢?答案是通过 Java的反射技术

4、Spring的DI例子

我们的service层总是用到dao层,以前我们总是在Service层new出dao对象,现在我们使用依赖注入的方式向Service层注入dao层。

// UserDao public class UserDao { public void add(){ System.out.println("dao....."); } } // UserService public class UserService { UserDao userdao; public void setUserdao(UserDao userdao){ this.userdao=userdao; } public void add(){ System.out.println("service......."); userdao.add(); } } -------------------------------分割线-------------------------- // 配置文件 <bean id="userdao" class="com.cad.domain.UserDao"></bean> //这样在实例化service的时候,同时装配了dao对象,实现了依赖注入 <bean id="userservice" class="com.cad.domain.UserService"> //ref为dao的id值 <property name="userdao" ref="userdao"></property> </bean>

四、Spring资源访问神器——Resource接口


JDK提供的访问资源的类(如java.NET.URL,File)等并不能很好很方便的满足各种底层资源的访问需求。Spring设计了一个Resource接口,为应用提供了更强的访问底层资源的能力,该接口拥有对应不同资源类型的实现类。

1、Resource接口的主要方法

  • boolean exists():资源是否存在

  • boolean isOpen():资源是否打开

  • URL getURL():返回对应资源的URL

  • File getFile():返回对应的文件对象

  • InputStream getInputStream():返回对应资源的输入流

Resource在Spring框架中起着不可或缺的作用,Spring框架使用Resource装载各种资源,包括配置文件资源,国际化属性资源等。

2、Resource接口的具体实现类

  • ByteArrayResource:二进制数组表示的资源

  • ClassPathResource:类路径下的资源 ,资源以相对于类路径的方式表示

  • FileSystemResource:文件系统资源,资源以文件系统路径方式表示,如d:/a/b.txt

  • InputStreamResource:对应一个InputStream的资源

  • ServletContextResource:为访问容器上下文中的资源而设计的类。负责以相对于web应用根目录的路径加载资源

  • UrlResource:封装了java.net.URL。用户能够访问任何可以通过URL表示的资源,如Http资源,Ftp资源等

3、Spring的资源加载机制

为了访问不同类型的资源,必须使用相应的Resource实现类,这是比较麻烦的。Spring提供了一个强大的加载资源的机制,仅通过资源地址的特殊标识就可以加载相应的资源。首先,我们了解一下Spring支持哪些资源类型的地址前缀:

  • classpath:例如classpath:com/cad/domain/bean.xml。从类路径中加载资源

  • file:例如 file:com/cad/domain/bean.xml.使用UrlResource从文件系统目录中加载资源。

  • http:// 例如http://www.baidu.com/resource/bean.xml 使用UrlResource从web服务器加载资源

  • ftp:// 例如frp://10.22.10.11/bean.xml 使用UrlResource从ftp服务器加载资源

Spring定义了一套资源加载的接口。ResourceLoader接口仅有一个getResource(String location)的方法,可以根据资源地址加载文件资源。资源地址仅支持带资源类型前缀的地址,不支持Ant风格的资源路径表达式。ResourcePatternResolver扩展ResourceLoader接口,定义新的接口方法getResources(String locationPattern),该方法支持带资源类型前缀以及Ant风格的资源路径的表达式。PathMatchingResourcePatternResolver是Spring提供的标准实现类。

4、例子

public class Test { public static void main(String[] args) throws IOException { ResourceLoader resloLoader = new DefaultResourceLoader(); Resource res = resloLoader.getResource("https://www.baidu.com/"); System.out.println(res instanceof UrlResource); // true BufferedReader bf = new BufferedReader(new InputStreamReader(res.getInputStream())); StringBuilder sb = new StringBuilder(); String temp = null; while ((temp = bf.readLine())!= null) { sb.append(temp); } System.out.println(sb.toString()); System.out.println("\n-----------------------------\n"); res = resloLoader.getResource("classpath:test.txt"); bf = new BufferedReader(new InputStreamReader(res.getInputStream())); sb = new StringBuilder(); temp = null; while ((temp = bf.readLine())!= null) { sb.append(temp); } System.out.println(sb.toString()); System.out.println("\n-----------------------------\n"); res = resloLoader.getResource("file:C:\\Users\\ricco\\Desktop\\test\\test.txt"); bf = new BufferedReader(new InputStreamReader(res.getInputStream())); sb = new StringBuilder(); temp = null; while ((temp = bf.readLine())!= null) { sb.append(temp); } System.out.println(sb.toString()); } }

五、Spring的Ioc容器详解


1、BeanFactory

BeanFactory是一个类工厂,和传统的类工厂不同,传统的类工厂仅负责构造一个类或几个类的实例;而BeanFactory可以创建并管理各种类的对象,Spring称这些被创建和管理的Java对象为Bean。

BeanFactory是一个接口,Spring为BeanFactory提供了多种实现,最常用的就是XmlBeanFactory。其中,BeanFactory接口最主要的方法就是getBean(String beanName),该方法从容器中返回指定名称的Bean。此外,BeanFactory接口的功能可以通过实现它的接口进行扩展(比如ApplicationContext)。看下面的示例:

//我们使用Spring配置文件为User类提供配置信息,然后通过BeanFactory装载配置文件,启动Spring IoC容器。 <?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 id="user" class="com.cad.domain.User"></bean> </beans> // 我们通过XmlBeanFactory实现类启动Spring IoC容器 public class Test { @org.junit.Test public void test(){ //获取配置文件 ResourcePatternResolver resolver=new PathMatchingResourcePatternResolver(); Resource rs=resolver.getResource("classpath:bean.xml"); //加载配置文件并启动IoC容器 BeanFactory bf=new XmlBeanFactory(rs); //从容器中获取Bean对象 User user=(User) bf.getBean("user"); user.speak(); } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值