#
1. 介绍
Spring是一个分层的JavaSE/EE应用的full-stack轻量级开源框架,以IOC(Inverse Of Control)和AOP(Aspect Oriented Programming)为核心,大大降低企业级应用开发的复杂性。
Spring体系结构:
2. web环境集成Spring
web集成spring需要在web.xml中配置spring提供的监听器类ContextLoaderListener
,启动参数分为spring配置文件和配置类(使用@Configuration的类)两种:
- 使用spring xml配置文件
spring监听器默认是加载xml文件,所以只需要配置xml文件路径
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
- 使用配置类
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--Spring监听器,使用注解方式启动--> <!--使用注解上下文环境类--> <context-param> <param-name>contextClass</param-name> <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> </context-param> <!--配置类位置--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>com.huangbei.config.SpringConfiguration</param-value> </context-param> <!--spring的web监听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
3. 应用
3.1. IOC
Spring 核心框架最重要的部分之一是 Spring IoC 容器。Spring IoC Container 主要负责实现控制反转控制(IoC) ,即通过创建对象并在运行时动态注入它们来实现类之间的松散耦合。
Spring IoC Containers 帮助实例化类和创建对象、配置对象、组装和管理对象之间的依赖关系。创建、配置和组装对象所需的信息是通过读取 XML 配置文件或扫描项目中使用的 Spring Java annotation 获得的。
IOC的核心原理是反射。
3.1.1. 依赖和配置
- 引入依赖spring-context
- 创建Spring bean配置文件,假设为bean.xml
- 在bean.xml中添加bean标签,属性为类的相关信息,比如id、全限定名、单例/多例、属性配置(实现依赖注入)等。
3.1.1.1. bean实例化的3种方式
- 无参构造方法实例化对象
- 自定义工厂类静态方法返回实例化对象
- 自定义工厂类实例方法返回实例化对象
3.2. AOP
Aspect-Oriented Programming,面向切面编程。
本质:在不修改方法源码的前提下,对方法原有的功能进行增强(扩展)。 作用:对于多个方法需要相同的功能扩展,使用AOP,提高代码的可重用性、可扩展性和可维护性等,降低系统的耦合性。
AOP的原理是动态代理,它的实现方式有两种:JDK提供的的动态代理和cglib提供的动态代理。
3.2.1. 使用
3.2.1.1. 基于XML
<!--织入配置-->
<aop:config>
<aop:pointcut id="p2" expression="execution(public boolean com.huangbei.aop.TargetServiceImpl.delete())"/>
<aop:pointcut id="p1" expression="execution(public void com.huangbei.aop.TargetServiceImpl.add())"/>
<aop:aspect ref="myAspect">
<aop:before method="m1" pointcut-ref="p1"/>
<aop:after method="m2" pointcut-ref="p1"/>
<aop:around method="m3" pointcut-ref="p2"/>
</aop:aspect>
</aop:config>
3.2.1.2. 基于Annotation
<context:component-scan base-package="com.huangbei.aop.anno"/>
<!-- 开启自动代理 -->
<aop:aspectj-autoproxy />