1.Spring
Spring是一系列框架
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
Spring核心,SpringMVC,Spring Boot
Spring核心:DI,IOC,AOP,容器context
SpringMVC代替了Servlet (SSM,Spring+SpringMVC+MyBatis)
(SSH , Spring+Struts+Hibernate)
SpringMVC目前技术比较成熟
2. 核心
容器,DI,IOC,AOP
Spring是一个容器,它里面有很多对象(框架自身的对象和我们的业务对象)
SSM或SSH组合中,Spring作为一个容器给其他框架提供对象。Spring在框架组合中起的是整合作用。
DI 叫依赖注入 DI Dependency Injection
一种设计思想,面向接口开发编程。在代码中通过接口定义一个变量,而不给变量赋值,在程序运行过程中,通过框架给这个变量赋值,让变量可以工作,如果变量没有通过框架赋值,则这个变量是空指针,无法正常工作,依赖框架给他注入实例。
IOC 控制反转 Inversion of Control
配合DI,程序的运行状态和结果通过框架来框架来控制,正常情况下是程序自己控制自己的流程,现在控制交给由外部的框架来决定,就是控制反转。
3.Spring 思想
三大思想:控制反转IOC 依赖注入DI 和面向切面AOP
1.控制反转
1.控制反转是一种设计模式
2.控制反转的主要形式有两种:依赖查找和依赖注入
依赖查找:容器提供回调接口和上下文件给组件。EJB和Apache Avalon 都用这种方式。 这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在哪些回调方法上。
依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。
把每个Servlet的访问路径具体绑定起来,当我访问每个路径,就会对应的某个方法上。
作为一个容器,是要控制组件。
4. 技术
Lombock,Logback
1.Lombock
1.1 引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
1.2 引入作用
Lombock 提高开发效率,自动生成Get/Set等方法。安装一个插件,这个插件自动生成class文件内容。
@Data
public class College {
/**
* 主键
**/
private int id;
/**
* 名称
**/
private String name;
/**
* 编码
**/
private String code;
}
给类添加lombok
@Date注解 自动生成 equals、 canEqual 、hashCode、get/set、ToString
@AllArgsConstructor 生成带有参数的构造函数 public College(int id, String name, String code)
@ToString(exclude = {"code"}) 生成ToString 并且除了code这个属性
在日常开发中,我们尽量少直接使用@Data注解
而是换成@Setter、@Getter、@NoArgsConstructor、@AllArgsConstructor、@ToString即可
2. Logback
2.1 引入依赖
负责记录日志的一个插件
<!-- logback 依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3<ersion>
</dependency>
2.2 作用
2.3 logback对比log4j的优点
- 更快的实现:Logback的内核重写了,不仅性能提升了,初始化内存加载也更小了。
- Logback-classic非常自然实现了SLF4j:Logback-classic实现了SLF4j。切换到log4j或者其他,只需要提供成另一个jar包就OK,根本不需要去动那些通过SLF4JAPI实现的代码。
自动重新加载配置文件,当配置文件修改了,Logback-classic能自动重新加载配置文件。 - Lilith是log事件的观察者,和log4j的chainsaw类似。而lilith还能处理大数量的log数据 。
- 在谨慎模式下,多个FileAppender实例跑在多个JVM下,能 够安全地写道同一个日志文件。FileAppender和它的子类包括 RollingFileAppender能够非常友好地从I/O异常中恢复。
- 配置文件可以处理不同的情况,一个配置文件就可以适应多个环境(开发,测试,生产)。
- Filters(过滤器),可以对特定的的业务设置不同的日志级别。要实现这个功能只需加4行XML配置。
- SiftingAppender(一个非常多功能的Appender):它可以用来分割日志文件根据任何一个给定的运行参数。
- 自动压缩已经打出来的log:RollingFileAppender在产生新文件的时候,会自动异步压缩已经打出来的日志文件。
- 堆栈树带有包版本:Logback在打出堆栈树日志时,会带上包的数据。
- 自动去除旧的日志文件:通过设置TimeBasedRollingPolicy或者 SizeAndTimeBasedFNATP的maxHistory属性,你可以控制已经产生日志文件的最大数量。
5. 容器 context
Spring有两种配置方式 一种是xml 一种是注解
1. 配置方式
-
xml
在resources下新建applicationContext.xml文件
-
注解
打开注解的开关,指明框架要扫描的包
Spring的注解很多,@Component组件注解是一个帆帆的总称,可以代替别的一些注解,比如:@Controller,@Service等注解
ApplicationContext.xml配置
<!--打开注解扫描开关-->
<context:annotation-config/>
<!-- 扫描路径-->
<context:component-scan base-package="com.ychs"/>
测试代码
public static void main(String[] args) {
String config = "_applicationContext.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(config);
College college = (College) context.getBean("college");
logger.debug("college=" + college);
}
2. 引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.0</version>
</dependency>
6. AOP 面向切面编程
Aspect Oriented Programming 面向切面编程
目标是通过定义一组共同的接口和组件来促进AOP的使用以及不同的AOP实现之间的互用性
面向切面是一个概念,通常用来为许多其他的类提供相同的服务,而且是固定的服务,是独立的。提升了代码的复用性,减少了代码的耦合度,减轻程序员的工作负担,把程序的重心放在了核心的逻辑上。
它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
应用场景有日志记录,性能统计,安全控制,事务处理,异常处理等。
eg:
1.系统没有任何日志的记录,现在给每个业务层的方法添加日志的记录。
解决方案
建一个类,再给类中通过AOP的技术实现统一日志的记录。
原理:Spring 把切面中新加的功能自动加到原有的业务类中,生成一个新的代理对象,这个代理对象是两个类的功能的总和。
2.给系统中的业务类增加统计的方法,那个用户在什么时间,操作了什么方法,参数是什么,结果是什么?
前提 拿到需要的数据
AOP可以做很多事,在获取程序的工作进程后,自己设计任何场景。
日志,统计,审核,安全控制,事务处理(SSM整合),异常处理等。这些附加的功能就是在AOP的切面类中完成。切面是一个自定义的类。
1.AOP的配置
引入依赖
<!-- 1.引入Lombok 自动生成class文件内容
<scope>provided</scope>
只在项目开发中使用它,在发布时候不需要它 scope
-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<!-- 2. 引入Logback 记录日志-->
<!-- logback 依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 3. 引入context 容器-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.0</version>
</dependency>
<!-- 4.导入aop依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.9</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
xml配置
- aspet 切面
- pointcut 切点(织入点的集合,是一个表达式)
- joinpoint 织入点 (具体的某个具体的业务方法,如:add,search…)
- advice 通知:就是AOP附加功能的方法 MuAop类的before /after方法
- adviser 顾问:是advice方法执行的时机(前,后,环绕,异常后)
- adviser 为after时,业务方法除了异常依然执行advice。
- 当adviser为after-returning时 除了异常则不在向下运行
- 当adviser为after-throwing时 当发生异常时 才会执行
- Spring通过切点(表达式的信息)获取到所有的织入点信息,进而监听织入点的执行情况,把切面中的附加功能加入到这些织入点中。
<!-- AOP的配置-->
<aop:config>
<!-- 指定AOP的切面对象 AOP的切面-->
<aop:aspect ref="myAOP">
<!-- 切点-->
<!-- 1. 第一个* 代表任意返回值
2. 第二个* 代表任意类名
3. 第三个* 任意方法明
4. (..)两点代表任意参数-->
<aop:pointcut id="pc" expression="execution(* com.ychs.Service.*.*(..))"/>
</aop:aspect>
</aop:config>
@Service //注解 会自动把当前类名首字母小写,作为容器中的名称
// 也可以通过@Service(value="xxx")来手动指定名称
advice 通知:就是before /after方法
* 描述: 切面类
*
* @author yk
* @version 1.0
* @date
*/
public class MyAop {
private Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 在业务方法执行前打印日志
**/
private void before(){
logger.debug("service method before...");
}
public void after() {
logger.debug("service method after....");
}
}
注解配置**