Spring概述
①Spring是一个开源框架
②Spring为简化企业级开发而生,使用Spring,JavaBean就可以实现很多以前要靠EJB才能实现的功能。同样的功能,在EJB中要通过繁琐的配置和复杂的代码才能够实现,而在Spring中却非常的优雅和简洁。
③Spring是一个IOC(DI)和AOP容器框架。
④Spring的优良特性
[1]非侵入式:基于Spring开发的应用中的对象可以不依赖于Spring的API
[2]依赖注入:DI——Dependency Injection,反转控制(IOC)最经典的实现。
[3]面向切面编程:Aspect Oriented Programming——AOP
[4]容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期
[5]组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象。
[6]一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上Spring 自身也提供了表述层的SpringMVC和持久层的Spring JDBC)。
Spring三大核心思想
①控制反转(IOC)
由spring来负责控制对象的生命周期和对象间的关系。所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转(IOC)。
② 属性注入(DI)
IOC的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。简单理解就是对象的属性由Spring通过一定的方式进行赋值。
③面向切面(AOP)
●AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统 OOP(Object-Oriented Programming,面向对象编程)的补充。
●AOP编程操作的主要对象是切面(aspect),而切面模块化横切关注点。
●在应用AOP编程时,仍然需要定义公共功能,但可以明确的定义这个功能应用在哪里,以什么方式应用,并且不必修改受影响的类。这样一来横切关注点就被模块化到特殊的类里——这样的类我们通常称之为“切面”。
SpringIOC
IoC 容器的接口设计图
整个 Spring IoC 容器就是以 BeanFactory 和 ApplicationContext 作为核心的
(1)BeanFactory:IOC容器的基本实现,是Spring内部的基础设施。
在3.1之前可以使用“XmlBeanFactory”,但是在3.2版本之后不建议使用了。转而建议使用“XmlBeanFactory”的父类“DefaultListableBeanFactory”.以及“XmlBeanDefinitionReader”。
定义好Spring的配置文件
通过Resource对象将Spring配置文件进行抽象,抽象成一个Resource对象。
定义好Bean工厂(各种BeanFactory)
定义好XmlBeanXmlBeanDefinitionReader对象,并将工厂作为参数传递进去供后续回调使用。
通过XmlBeanBefinitionReader对象读取之前抽象出来的Resource对象(包含了XML文件的解析过程)。
IOC容器创建完毕,用户可以通过容器获取到所需的对象信息。
ClassPathResource res = new ClassPathResource("applicationConText.xml") ;
DefaultListableBeanFactory factory = new DefaultListableBeanFactory() ;
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory) ;
reader.loadBeanDefinitions(res) ;
User user = (User) factory.getBean("user");
System.out.println(user);
(2)ApplicationContext:BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory。
BeanFactory :采取延迟加载,是在第一次getBean的时候才会生成类的实例.
ApplicationContext :在加载applicationContext.xml时候就会创建.
ApplicationContext是对BeanFactory的扩展,提供了更多功能
a. 国际化支持
b. 资源访问:Resource rs = ctx. getResource(“classpath:config.properties”), “file:c:/config.properties”
c. 事件传递:通过实现ApplicationContextAware接口
常用的获取ApplicationContext
①FileSystemXmlApplicationContext
classpath:前缀是不需要的,默认就是指项目路径下面;
如果要使用绝对路径,file:前缀可有可无,不影响
②ClassPathXmlApplicationContext
没有盘符的是项目工作路径,即项目的根目录;
如果要使用绝对路径,需要加上file:前缀表示这是绝对路径;
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("src/applicationContext.xml");
ApplicationContext applicationContext1 = new FileSystemXmlApplicationContext("file:D:\\applicationContext.xml");
User user = (User) applicationContext.getBean("user");
User user1 = (User) applicationContext1.getBean("user");
ApplicationContext applicationContext2 = new ClassPathXmlApplicationContext("applicationConText.xml");
User user2 = (User) applicationContext2.getBean("user");
ApplicationContext applicationContext3 = new ClassPathXmlApplicationContext("file:D:\\applicationConText.xml");
User user3 = (User) applicationContext3.getBean("user");
System.out.println(user);
System.out.println(user1);
System.out.println(user2);
System.out.println(user3);
spring5.1.0中测试