框架(Framework):框(指其约束性)、架(指其支撑性)。
在软件设计中指为解决一个开放性问题,而设计的具有一定约束性的支撑结构。
Spring官网 https://spring.io
Spring是一个分层、(JavaSE/EE full-stack)开源、轻量级的Java开发框架。
Spring的两大核心:控制反转(IOC)和面向切面(AOP)。
Spring框架通过声明的方式灵活进行事务的管理,提高开发效率和质量。
Spring的优势:
1.方便解耦
Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给Spring管理。
2.方便集成
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如Struts2、Hibernate、MyBatis等)的直接支持。
3.降低了JavaEE API的使用难度
Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等)都提供了封装,使这些API应用的难度大大降低。
4.方便程序的测试
Spring支持JUnit4,可以通过注解方便Spring程序的测试。
5.AOP编程的支持
Spring提供面向切面编程,可以方便实现对程序的权限拦截和运行监控等功能。
6.声明式事务管理的支持
只需要通过配置就可以完成对事务的管理,无须手动编程。
Spring为我们提供了一站式的解决方案,但Spring是模块化的,允许只挑选适用于项目的模块,不需要把剩余的部分也引入。
Spring框架提供了约20个模块,可以根据应用程序的要求来选择。
IoC-Inversion of Control(控制反转)是指在程序开发中实例的创建不再由调用者管理,而是由Spring容器创建,Spring容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此控制权由程序代码转移到了Spring容器中,控制权发生了反转,这就是Spring的IOC思想。
获取Spring容器
Spring提供了两种IOC容器,分别为BeanFactory和ApplicationContext。
BeanFactory是基础类型的IoC容器,是一个管理Bean的工厂,它主要负责初始化各种Bean,并调用它们的生命周期方法。BeanFactory接口有多个实现类,最常见的是org.Springframework.beans.factory.xml.XmlBeanFactory,它是根据XML配置文件中的定义装配Bean的。
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource(Spring配置文件的名称));
ApplicationContext是BeanFactory的子接口,也被称为应用上下文。它不仅提供了BeanFactory的所有功能,还添加了对i18n(国际化)、资源访问、事件传播等方面的良好支持。
ApplicationContext接口有两个常用的实现类:
ClassPathXmlApplicationContext和FileSystemXmlApplicationContext。
ApplicationContext applicationContext= new ClassPathXmlApplicationContext(Spring配置文件的名称);
该类从类路径中寻找指定的XML配置文件,并装载完成ApplicationContext的实例化工作。
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);
FileSystemXmlApplicationContext在读取Spring的配置文件时,不再从类路径中读取配置文件,而是通过参数指定配置文件的位置,它可以获取类路径以外的资源,如:“D:\spring.xml”。
DI—Dependency Injection(依赖注入)是指组件之间依赖关系由容器在运行期决定,即由容器动态的将某个依赖关系注入到组件之中。
IOC和DI是同一概念不同角度的描述。IOC是一种思想、概念,DI是实现它的手段。Spring框架使用依赖注入实现IOC。
Spring容器是一个超级大工厂,负责创建、管理所有的Java对象,这些Java对象被称为Bean(bean标签的属性,详情看Spring入门案例)。
Spring容器使用“依赖注入”的方式来管理Bean之间的依赖关系,使用IoC实现对象之间的解耦和。
基于注解实现IOC
对于DI使用注解,将不需要在Spring配置文件中声明bean实例。Spring中使用注解,需要在原有的Spring运行环境基础上再做一些改变。
@Component(万能注解):bean实体类的注解,属性value的id值(可省略),默认为类名(首字母要小写)。
@Repository/@Service/@Controller:dao/service/controller实现类的注解。
@Service创建的业务层对象可以加入事务功能
@Controller创建的对象可以作为处理器接收用户的请求
@Repository、@Service、@Controller是对@Component注解的细化,标注不同层的对象(持久层、业务层、控制层)。
<beans xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd" >
需要在Spring配置文件中配置组件扫描器,用于指定基本包中扫描注解,如果没有包扫描,则添加创建对象的注解不生效。如果要扫描的包有多个,可以通过以下方式扫描:
1、使用多个context:component-scan指定不同的包路径
<context:component-scan base-package="包1"></context:component-scan>
<context:component-scan base-package="包2"></context:component-scan>
<context:component-scan base-package="包3"></context:component-scan>
2、指定base-package的值使用分隔符
分隔符可以使用逗号、分号、还可以使用空格(不建议)
<context:component-scan base-package="包1,包2,包3"></context:component-scan>
3、base-package是指定到父包名
base-package的值表示基本包,容器启动会扫描父包及其子包中的注解,当然也会扫描到子包下级的子包,所以base-package指定一个父包就可以,但不建议使用顶级的父包(扫描的路径比较多,导致容器启动的时间变慢),应指定到目标包(也就是注解所在包的全路径)。
注入分类
1、通过set方法
<property name="teamDao" class="com.syh.dao.TeamDao"></property>
set方法注入也叫设值注入,是指通过set方法传入被调用者的实例,这种注入方式简单、直观,因而在Spring的依赖注入中大量使用。
2、通过构造方法
<constructor-arg name="id" value="101"></constructor-arg>
构造注入是指在构造调用者实例的同时,完成被调用者的实例化,使用构造器设置依赖关系。
3、自动注入
<bean id="teamService" class="com.syh.dao.TeamService"
autowire="byName/byType(要求类型相同的类对象唯一)"></bean>
对于引用类型属性的注入,也可以不在配置文件中显式的注入,而是通过为标签设置autowire的属性值,为引用类型属性进行隐式的自动注入(默认是不自动注入)。根据自动注入判断标准的不同,可以分为两种:byName和byType。
byType:@Autowired(自动装配,默认按照类型装配)
需要在引用属性上使用注解@Autowired,该注解默认使用按类型自动装配Bean的方式,使用该注解完成属性注入时,类中无需set方法,当然若有set方法,也可将其加到set方法上。
byName:@Autowired和@Qualifier
需要在引用属性上联合使用注解@Autowired和@Qualifier,@Qualifier的value 属性用于指定要匹配的Bean的id值。类中无需set方法,当然若有set方法,也可将其加到set方法上。
@Autowired还有一个属性required,默认值为true,表示当匹配失败后,会报错。若将其值设置为false,则匹配失败后将被忽略,会报空指针异常。
@Resource(name="",type="")
Spring提供了对JDK中@Resource注解的支持。@Resource注解默认按名称自动装配Bean,如果名称不相符,也可以按类型自动装配Bean。使用该注解要求JDK必须是1.6以上的版本。
@Resource可以用在属性上,也可以用在set方法上。
@Value(创建对象后才进行注入)
需要在属性上使用注解@Value,该注解的value属性用于指定要注入的值,使用该注解完成属性注入时,类中无需set方法,当然若有set方法,也可将其加到set方法上。
AOP(Aspect Oriented Programming)意思是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
AOP的作用:在不修改源码的情况下,程序运行期间对方法进行功能增强。
好处:1、减少代码的重复,提高开发效率,便于维护。
2、专注核心业务的开发。
核心业务和服务性代码混合在一起。
开发中:各自做自己擅长的事情,运行时,通过spring工厂自动实现将服务性代码以切面的方式加入到核心业务代码中。
代理:自己不做,找别人帮你做。
代理模式:在一个原有功能的基础上添加新的功能。
分类:静态代理和动态代理。
<