一、Spring
1 Spring是什么?
Spring 是分层的JavaEE/JavaSE应用full-stack(全栈) 轻量 开源 半成品框架,以IOC(反转控制)和AOP(面向切面编程)为内核。
事务的应该具有的四个属性:原子性、一致性、隔离性、持久性。
2 Spring的优势
- 方便解耦,简化开发
- 方便集成各种框架
- 方便程序的测试
- 切面编程的支持
- 声明式事务的支持@Transactional
- 降低JavaEE API的使用难度
二、IOC反转控制
1 概念
IOC,反转控制:将操作对象的控制权交给spring来管理。
DI,即依赖注入,处理对象之间的依赖关系。
由Spring IOC 容器来负责对象的生命周期和对象之间的关系。
2 理解
怎么理解反转控制
我们通常做事的方式,如果我们需要某个对象,一般都是采用这种自己直接创建的方式,这个过程复杂而又繁琐,而且我们必须要面对每个环节,同时使用完成之后我们还要负责销毁它,在这种情况下我们的对象与它所依赖的对象**耦合**在一起。
3 Bean标签说明
- id:Bean实例在Spring容器中的唯一标识。
- calss:Bean的完全限定名称。
- scope:范围配置,singleton:单例模式(默认),prototype:原型模式(多例)。
4 生命周期
-
当scpoe的取值为singleton时
Bean的实例化个数:1个。
实例化的时机:当时 spring核心文件(配置文件appliction.xml)被加载时,实例化配置的Bean实例。
Bean的生命周期:
对象创建:当应用加载,创建容器时,对象就被创建了。
对象运行:容器在,对象就一直存在。
对象销毁:当应用卸载,销毁容器时,对象就被销毁了。
-
当scope的取值为prototype时
Bean实例化个数:多个
实例化的时机:当调用getBean()方法时实例化Bean
Bean的生命周期:
对象创建:当使用对象时,创建新的对象实例。
对象运行:只要对象在使用中,就一直存在。
对象销毁:当对象长时间不使用,就会被jvm的垃圾回收机制回收了。
以上bean对象实例化都是spring调用对象的无参构造方法。(工厂实例方法,工厂静态方法)
5 DI依赖注入
两种方式:set注入 构造注入
6 Spring常用注解:
- @Component -----实体类上 创建对象
- @Controller---------controller层的实例化对象
- @Service -------------service层的实例化对象
- @Repository---------dao层的实例化对象
- @Autowired----------根据类型依赖注入
- @Qualifier-------------结合@Autowired用于根据名称实例
- @Resource------------根据@Autowired+@Qualifier结合按照名称注入
- @Value------------------注入普通属性
三、AOP
1 什么是AOP
- AOP 面向切面编程:通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
2 AOP的作用及其优势
- 作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强。
- 优势:减少重复代码,提高开发效率,并且便于维护。
3 底层实现
- AOP的底层实现:通过Spring提供的动态代理技术实现的。在运行期间,spring通过动态代理技术动态生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能的增强。
4 常用的动态代理技术
- JDK代理:基于接口的动态代理技术
- cglib代理:基于父类的动态代理技术。
5 jdk代理
/**
* 接口类
*/
public interface TargetInterface {
void say();
}
/**
* 目标类
*/
public class Target implements TargetInterface {
public void say() {
System.out.println("目标类执行了");
}
}
public static void main( String[] args ) {
final Target target = new Target();
//生成了一个代理类对象proxy
TargetInterface proxy = (TargetInterface)Proxy.newProxyInstance(
//第一个参数被代理类的类加载器
target.getClass().getClassLoader(),
//第二个参数target的所以实现接口
target.getClass().getInterfaces(),
//第三参数是InvocationHandler
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("前面增强");
Object invoke = method.invoke(target, args);
System.out.println("后置增强");
return invoke;
}
});
proxy.say();
}
- Proxy.newProxyInstance()方法是生成代理对象的,有三个参数,类加载器,目标类的所以接口字节码对象,InvocationHandler。
- InvocationHandler:可以理解为一个回调函数,里面的invoke()是关键,代理对象执行方法就是在执行invoke()方法。
- method.invoke(target,args);属于反射,方法的执行
java反射包中的Proxy类可以调用newProxyInstance创建一个代理类对象。传入三个参数,
一个是代理类的类加载器,
一个是实现的所有接口数组,
一个调用处理器的实现类。
创建好了代理对象,代理对象就可以执行被代理类实现的接口的方法,在执行方法时,会先去执行调用处理器实现类中的invoke方法,invoke方法就可以对被代理类进行功能增强.
6 反射
原理:在Java 程序中,JVM
加载完一个类后,在堆内存中就会产生该类的一个 Class
对象,一个类在堆内存中最多只会有一个 Class
对象,这个Class
对象包含了该类的完整结构信息,我们通过这个 Class
对象便可以得到该类的完整结构信息。
反射机制:系统在运行状态中,对于任意的一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象方法的功能称为Java的反射机制。
使用反射的前提条件(必须先得到这个类的.class文件)。
7 AOP相关概念
@Component
@Aspect:切面类,告诉spring这个类是个切面
@Pointcut:切点 指我们要对哪些JoinPoint 进行拦截的定义
@Before 之前
@after 之后
@around 环绕
8 用到的依赖
<!--导入spring的context坐标,context依赖aop-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!-- aspectj的织入 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
9 切点表达式
execution([修饰符] 返回值类型 包名.类名.方法名(参数))
常用的书写格式:
execution(* 包名.*.*(..))
- 访问修饰符可以省略
- 返回值类型、包名、类名、方法名可以使用星号* 代表任意
- 包名与类名之间一个点 . 代表当前包下的类,两个点 … 表示当前包及其子包下的类
- 参数列表可以使用两个点 … 表示任意个数,任意类型的参数列表
10 组件扫描
<!--组件扫描-->
<context:component-scan base-package="com.xinzhi"/>
<!--aop的自动代理-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>