Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
构建spring框架,需要安装STS插件和引入依赖
<!-- 1.Spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
1.IOC和DI思想
(1)IOC:控制反转,是一种设计思想,好比MVC
反控:调用者只管负责从spring容器中获取需要使用的对象,不关心对象的创建过程,也不关心该对象依赖对象的创建以及依赖关系的组装,也就是把创建对象的控制权反转给了spring框架
这里完美地体现了好莱坞法则(Don't call me,I' ll call you)
DI:Dependency Injection(依赖注入)从字面上分析:指spring创建对象的过程中,将对象依赖属性(常量,对象,集合)通过设置配置设值给该对象。
IoC从字面上意思很难体现出谁来维护对象之间的关系,Martin Fowler提出一个新的概念--DI,更明确描述了“被注入对象(Service对象)依赖IOC容器来配置依赖对象”。
2.Bean
被Spring IoC容器管理的对象称之为bean
Spring IoC容器如何知道哪些是它管理的对象:
此时需要配置文件,Spring IoC容器通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配
元数据的配置有三种:
- XML-based configuration
- Annotation-based configration
- Java-based configuration
Spring IoC管理bean的原理:
bean的创建:
BeanFactory:Spring最底层的接口,只提供了IoC功能,负责创建、组装、管理bean,一般不使用BeanFactory,而推荐使用ApplicationContext(应用上下文)
ApplicationContext接口继承了BeanFactory,除此之外还提供AOP集成、国际化出路、事件传播、统一资源价值等功能
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
Hello h = (Hello) applicationContext.getBean("helloclass");
Bean作用域:
bean元素继承
bean元素的继承:把多个bean元素共同属性配置抽取到另一个公用的bean元素中
原来的配置:
存在继承后:
3.DI核心
什么是注入操作?
怎么注入
setter方法注入
构造器注入
注入值类型
1)常量值(简单类型):value元素
2)对象:ref元素
3)集合:对应集合类型元素
Setter方法注入
其实就是通过对象的setter方法来完成对象的设置操作
1.使用bean元素的<property>子元素设置
1)常量类型,直接使用value赋值
2)引用类型,使用ref赋值
3)集合类型,直接使用对应的集合类型元素即可
2.Spring通过属性的setter方法注入值
3.在配置文件中配置的值都是String,Spring可以自动的完成类型转换
构造器注入
其实就是通过构造器,在完成创建对象的时候,同时初始化对象设置数据的操作:
构造器方式注入使用:<consructor-arg/>元素
4.DI注解
1)Autowired注解
- 可以让spring自动的把属性所需要的对象找出来,并注入到对象
- 可以贴在字段或者setter方法上
- 可以同时注入多个对象
- 可以注入一些内置spring内置的重要对象,比如BeanFactory,ApplicationContext,ServletContext等
- 默认情况Autowired注解必须找到对应的对象,否则报错 通过required=false来避免这个问题:@Autowired(required=false)
Resource的用法和Autowired差不多
2)Value注解
Autowired和Resource注解用于注入对象,Value注解用于注入常量数据
5.IOC注解
bean组件版型:四个组建的功能相同,只是用于标注不同类型的组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
@Repository用于标注数据访问组件,即DAO组件
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的Action,SpringMVC的controller)
此时需要配置IOC注解的解析器
使用<context:component-scan base-package=" "/> 表示去哪些包及其子包中去扫描组件注解
作用域注解:
使用Scope注解,设置Bean的作用域。
初始化和销毁注解:
@PostConstruct用于贴在初始化方法上
@PreDestory用于贴在销毁方法上