Spring框架的核心技术 | 您所在的位置:网站首页 › 轻量级开源框架是什么 › Spring框架的核心技术 |
Spring概述 Spring是一个分层的Java SE/EE应用一站式的轻量级开源框架。Spring核心是IOC和AOP。 Spring主要优点包括: 方便解耦,简化开发,通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码造成的程序耦合度高。AOP编程的支持,通过Spring提供的AOP功能,方便进行面向切面编程。声明式事务的支持,在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。方便程序的测试,可以用非容器依赖的编程方式进行几乎所有的测试工作。方便集成各种优秀框架,Spring提供了对各种优秀框架的直接支持。 Spring体系结构 整个spring框架按其所属功能可以划分为五个主要模块,这五个模块几乎为企业应用提供了所需的一切,从持久层、业务层到表现层都拥有相应的支持,这就是为什么称Spring是一站式框架的原因。![]() 由于IoC确实不够开门见山,所以提出了DI(依赖注入:Dependency Injection)的概念,即让第三方来实现注入,以移除我们类与需要使用的类之间的依赖关系。总的来说,**IoC是目的,DI是手段,**创建对象的过程往往意味着依赖的注入。我们为了实现IoC,让生成对象的方式由传统方式(new)反转过来,需要创建相关对象时由IoC容器帮我们注入(DI)。 简单的说,就是我们类里需要另一个类,只需要让Spring帮我们创建 ,这叫做控制反转;然后Spring帮我们将需要的对象设置到我们的类中,这叫做依赖注入。 2.常见的几种注入方法 使用有参构造方法注入 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就是这样的容器,它通过配置文件或注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入的工作。 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配置文件 //配置要创建的类(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(); } } -------------------------------分割线-------------------------- // 配置文件 //这样在实例化service的时候,同时装配了dao对象,实现了依赖注入 //ref为dao的id值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容器。 // 我们通过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。 2.ApplicationContext ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要编程方式来实现,而ApplicationContext中可以通过配置的方式来实现。ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中加载配置文件,如下所示: // 和BeanFactory初始化相似,ApplicationContext初始化也很简单 ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");ApplicationContext的初始化和BeanFactory初始化有一个重大的区别,BeanFactory初始化容器时并未初始化Bean,只有第一次访问Bean时才创建;而ApplicationContext则在初始化时就实例化所有的单实例的Bean。因此,ApplicationContext的初始化时间会稍长一点。 3.WebApplicationContext WebApplicationContext是专门为Web应用准备的,它允许以相对于Web根目录的路径中加载配置文件完成初始化工作。从WebApplicationContext中可以获取ServletContext的引用,整个WebApplicationContext对象作为属性放置到ServletContext中,以便Web应用环境中可以访问Spring应用上下文。ConfigurableWebApplicationContext扩展了WebApplicationContext,允许通过配置方式实例化WebApplicationContext,定义了两个重要方法。 setServletContext(ServletContext servletcontext):为Spring设置ServletContext setConfigLocation(String[] configLocations):设置Spring配置文件地址。 WebApplicationContext初始化的时机和方式是:利用Spring提供的ContextLoaderListener监听器去监听ServletContext对象的创建,当ServletContext对象创建时,创建并初始化WebApplicationContext对象。因此,我们只需要在web.xml配置监听器即可。 org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath:applicationContext.xml4.BeanFactory、ApplicationContext和WebApplicationContext的联系与区别 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应用。 5.父子容器 通过HierarchicalBeanFactory接口,Spring的IoC容器可以建立父子层级关联的体系:子容器可以访问父容器的Bean,父容器不能访问子容器的Bean。 Spring使用父子容器实现了很多功能,比如在Spring MVC中,控制器Bean位于子容器中,业务层和持久层Bean位于父容器中。但即使这样,控制器Bean也可以引用持久层和业务层的Bean,而业务层和持久层就看不到控制器Bean。 |
CopyRight 2018-2019 实验室设备网 版权所有 |