Spring框架
1.总纲(意识形态) -> 框架的意义不在于让程序员干什么,而在于不让程序员干什么。
2.核心思想 -> 关系处理
1)IoC(控制反转) DI(依赖注入) -> 对象与对象之间的关系
将依赖项的直接(new)实例化,转换为通过容器注入产生,实现依赖关系解耦。原理:Java反射。
2)AOP(面向切面编程) -> 业务与业务之间的关系
在不影响基础业务的前提下,通过容器,在特定的切点(pointcut)上织入(可拆卸)代理业务,
实现对原业务的扩展更新甚至否决。原理:动态代理 (注意:两种实现方法)
3.实现步骤
1)引入Schema(*.xsd)文件(获取文件)
链接:https://pan.baidu.com/s/1EpxM0zJvQ_0JPVNEc8HIaA 提取码:afni
复制这段内容后打开百度网盘手机App,操作更方便哦
spring-aop-3.0.xsd AOP
spring-beans-3.0.xsd IoC DI
spring-context-3.0.xsd @注解
spring-mvc-3.0.xsd SpringMVC
spring-task-3.0.xsd 任务调度
spring-tx-3.0.xsd 事务管理
2)引入依赖项(*.pom)
<properties>
<spring.version>4.3.14.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<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-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
3)完成容器配置(applicationContext.xml)
String configLocation = "applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocation);
注意:
容器管理Bean必须保留空构造(No default constructor found)
依赖注入必须提供对应setter()方法(is not writable or has an invalid setter method)
注解环境中setter()方法可以省略
4.解析IoC配置 核心组成是DI(一个bean对应的就是一个类,ref会匹配bean(也就是类)依赖对象,完成依赖注入)
//面向接口
<bean id="" class="">
<property name="" value="" />
<property name="" ref="" /> -> 依赖注入
</bean>
<bean name="{name1},{name2}" /> -> 可以通过多个命名定位 注意:无论是id还是name都必须唯一
<bean scope="" />
singleton -> 单例 默认模式
prototype -> 非单例
request -> 请求作用域(web环境)
session -> 会话作用域(web环境)
<constructor-arg index="{索引}" value="{value}"></constructor-arg> -> 带参构造
<constructor-arg name="{形参}" value="{value}"></constructor-arg> -> 带参构造
<property name="author"> -> 数组
<array>
<value>Apache3</value>
<value>Apache4</value>
</array>
</property>
<property name="history"> -> 集合
<map>
<entry key="2000" value="销售10000"></entry>
<entry key="2001" value="销售20000"></entry>
<entry key="2002" value="销售30000"></entry>
</map>
</property>
5.解析AOP配置
配置:
<!-- AOP配置 -->
<aop:config>
<!-- 切点 expression表达式 匹配规则-->
<aop:pointcut expression="execution(* com.uplooking.service..*.*(..))" id="p1"/>
<!-- 通知 -->
<aop:aspect ref="bookProxy">
<!-- 前置通知 before -->
<aop:before method="test" pointcut-ref="p1"/>
</aop:aspect>
</aop:config>
处理通知的类BookServiceProxy.java
package com.uplooking.service.proxy;
public class BookServiceProxy {
public void test(){
System.out.println("测试AOP");
}
}
通知:
前置 before -> 在业务调用之前通知 不受异常干扰
后置 after -> 在业务调用之后通知 不受异常干扰
返回 return -> 在业务调用(没有异常)完成之后通知 并获取业务返回值 并可以修改数据结果
异常 throw -> 在业务调用时发生异常并抛出后通知
环绕 around -> 在所有通知中 只有环绕通知才能根本上实现对业务的控制 动态代理本质
AOP切点表达式解析
cron表达式
Spring -> “粘合剂”:我们不生产"轮子" 我们只提供轮子良好运行"平台"
Spring注解 - 简洁明了
1)IoC
//控制反转
@Component ->通用
@Repository ->持久
@Service ->业务
@Controller ->控制
//依赖注入
@Autowired
补充:依赖注入原理
优先通过byType查找(类型匹配) -> 如果类型匹配不只一个
在通过byName(形参同名)查找 -> @Qualifier("bookDO")
注意:IoC扫描范围包含注解
2)AOP
@Aspect ->代理类
@Pointcut ->切点
@Around ->环绕通知
@Before ->前置通知
@After ->后置通知
@AfterReturning ->返回通知
@AfterThrowing ->异常通知
注意:AOP注解默认不启用 -> 自动启动