Spring是一个分层的Java SE/EE应用一站式的轻量级开源框架
。Spring核心是IOC
和AOP
。
Spring主要优势包括:java
以下图所示,整个spring框架按其所属功能能够划分为五个主要模块,这五个模块几乎为企业应用提供了所需的一切,从持久层、业务层到表现层都拥有相应的支持,这就是为何称Spring是一站式框架的缘由。 web
Spring的核心模块实现了IoC的功能,它将类和类之间的依赖从代码中脱离出来,用配置的方式进行依赖关系描述。由IoC容器负责类的建立,管理,获取等。BeanFactory接口是Spring框架的核心接口,实现了容器不少核心的功能。spring
Context模块构建于核心模块之上,扩展了BeanFactory的功能,包括国际化,资源加载,邮件服务,任务调度等多项功能。ApplicationContext是Context模块的核心接口。express
表达式语言(Expression Language)是统一表达式语言(EL)的一个扩展,支持设置和获取对象属性,调用对象方法,操做数组、集合等。使用它能够很方便的经过表达式和Spring IoC容器进行交互。编程
Spring AOP模块提供了知足AOP Alliance规范的实现,还整合了AspectJ这种AOP语言级的框架。经过AOP能下降耦合。数组
该模块包括了JDBC、ORM、OXM、JMS和事务管理:缓存
该模块创建在ApplicationContext模块之上,提供了Web应用的功能,如文件上传、FreeMarker等。Spring能够整合Struts2等MVC框架。此外,Spring本身提供了MVC框架Spring MVC。服务器
Spring能够用非容器依赖的编程方式进行几乎全部的测试工做,支持JUnit和TestNG等测试框架。app
咱们首先来说解一下IoC的概念。IoC(控制反转:Inverse of Control)是Spring容器的核心,可是IoC这个概念却比较晦涩,让人不太容易望文生义。框架
传统程序设计中,咱们须要使用某个对象的方法,须要先经过new建立一个该对象,咱们这时是主动行为;而IoC是咱们将建立对象的控制权交给IoC容器,这时是由容器帮忙建立及注入依赖对象,咱们的程序被动的接受IoC容器建立的对象
,控制权反转,因此叫控制反转。
因为IoC确实不够开门见山,因此提出了DI(依赖注入:Dependency Injection)的概念,即让第三方来实现注入,以移除咱们类与须要使用的类之间的依赖关系。总的来讲,IoC是目的,DI是手段,建立对象的过程每每意味着依赖的注入。咱们为了实现IoC,让生成对象的方式由传统方式(new)反转过来,须要建立相关对象时由IoC容器帮咱们注入(DI)。
简单的说,就是咱们类里须要另外一个类,只须要让Spring帮咱们建立 ,这叫作控制反转
;而后Spring帮咱们将须要的对象设置到咱们的类中,这叫作依赖注入
。
public class User{ private String name; public User(String name){ this.name=name; } } User user=new User("tom");
public class User{ private String name; public void setName(String name){ this.name=name; } } 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就是这样的容器,它经过配置文件或注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入的工做。
(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的反射技术
。
咱们的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>
JDK提供的访问资源的类(如java.NET.URL,File)等并不能很好很方便的知足各类底层资源的访问需求。Spring设计了一个Resource接口,为应用提供了更强的访问底层资源的能力,该接口拥有对应不一样资源类型的实现类。
Resource在Spring框架中起着不可或缺的做用,Spring框架使用Resource装载各类资源,包括配置文件资源,国际化属性资源等。
为了访问不一样类型的资源,必须使用相应的Resource实现类,这是比较麻烦的。Spring提供了一个强大的加载资源的机制,仅经过资源地址的特殊标识就能够加载相应的资源。首先,咱们了解一下Spring支持哪些资源类型的地址前缀
:
Spring定义了一套资源加载的接口。ResourceLoader接口仅有一个getResource(String location)的方法,能够根据资源地址加载文件资源。资源地址仅支持带资源类型前缀的地址,不支持Ant风格的资源路径表达式。ResourcePatternResolver扩展ResourceLoader接口,定义新的接口方法getResources(String locationPattern),该方法支持带资源类型前缀以及Ant风格的资源路径的表达式。PathMatchingResourcePatternResolver是Spring提供的标准实现类。
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()); } }
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(); } }
XmlBeanFactory装载Spring配置文件并启动IoC容器,经过BeanFactory启动IoC容器时,并不会初始化配置文件中定义的Bean,初始化建立动做在第一个调用时。在初始化BeanFactory,必须提供一种日志框架,咱们使用Log4J。
ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,不少功能须要编程方式来实现,而ApplicationContext中能够经过配置的方式来实现。ApplicationContext的主要实现类是ClassPathXmlApplicationContext
和FileSystemXmlApplicationContext
,前者默认从类路径加载配置文件,后者默认从文件系统中加载配置文件,以下所示:
// 和BeanFactory初始化类似,ApplicationContext初始化也很简单 ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
ApplicationContext的初始化和BeanFactory初始化有一个重大的区别,BeanFactory初始化容器时并未初始化Bean,只有第一次访问Bean时才建立;而ApplicationContext则在初始化时就实例化全部的单实例的Bean
。所以,ApplicationContext的初始化时间会稍长一点。
WebApplicationContext是专门为Web应用准备的,它容许以相对于Web根目录的路径中加载配置文件完成初始化工做。从WebApplicationContext中能够获取ServletContext的引用,整个WebApplicationContext对象做为属性放置到ServletContext中,以便Web应用环境中能够访问Spring应用上下文。ConfigurableWebApplicationContext
扩展了WebApplicationContext,容许经过配置方式实例化WebApplicationContext,定义了两个重要方法。
WebApplicationContext初始化的时机和方式
是:利用Spring提供的ContextLoaderListener监听器去监听ServletContext对象的建立,当ServletContext对象建立时,建立并初始化WebApplicationContext对象。所以,咱们只须要在web.xml配置监听器便可。
<!-- 利用Spring提供的ContextLoaderListener监听器去监听ServletContext对象的建立,并初始化WebApplicationContext对象 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Context Configuration locations for Spring XML files(默认查找/WEB-INF/applicationContext.xml) --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
Spring经过一个配置文件描述Bean与Bean之间的依赖关系,经过Java语言的反射技术能实例化Bean并创建Bean之间的依赖关系。Spring的IoC容器在完成这些底层工做的基础上,还提供了bean实例缓存、生命周期管理、事件发布,资源装载等高级服务。
BeanFactory是Spring最核心的接口,提供了高级IoC的配置机制。ApplicationContext创建在BeanFactory的基础上,是BeanFactory的子接口,提供了更多面向应用的功能。咱们通常称BeanFactory为IoC容器
,ApplicationContext为应用上下文
,也称为Spring容器
。WebApplicationContext是专门为Web应用准备
的,它容许以相对于Web根目录的路径中加载配置文件完成初始化工做,是ApplicationContext接口的子接口。
BeanFactory是Spring框架的基础,面向Spring自己;ApplicationContext面向使用Spring框架的开发者,几乎全部的应用咱们都直接使用ApplicationContext而非底层的BeanFactory;WebApplicationContext是专门用于Web应用。
经过HierarchicalBeanFactory接口,Spring的IoC容器能够创建父子层级关联的体系:子容器能够访问父容器的Bean,父容器不能访问子容器的Bean。
Spring使用父子容器实现了不少功能,好比在Spring MVC中,控制器Bean位于子容器中,业务层和持久层Bean位于父容器中。但即便这样,控制器Bean也能够引用持久层和业务层的Bean,而业务层和持久层就看不到控制器Bean。
更多精彩文章,关注公众号【ToBeTopJavaer】,更有数万元精品vip资源免费等你来拿!!!