目录:
- spring概念
- ioc和aop
- spring事务
- spring源码
起源:2002年 推出spring雏形 interface21 2004 3.24 正式推出spring1.0版本
目的:解决企业级开应用发决业务逻辑层和其他层的耦合问题
设计理念:是现有技术更加容易使用,整合了现有的技术框架
一个轻量级的 控制反转 和 面向切面编程 的容器框架 (容器:管理应用对象的生命周期,如:bean)
一个轻量级 开源的 javaEE 框架
一个轻量级 非侵入性 的框架
(侵入性:比如ejb 一个类实现某个功能,需要继承特定的类。
非侵入式:不需要用户代码引入框架代码的信息,从类的编写者角度来看,察觉不到框架的存在。)
IOC:
- IOC底层原理
- IOC接口(beanFactory)
- IOC操作bean管理(基于xml方式)
- IOC操作bean管理(基于注解方式)
1、概念
控制反转:指创建对象的权利有ioc容器来创建
DI 依赖注入 动态的向某个对象提供它所需要的其他对象。
di的底层实现是反射
DI 是ioc的一种实现方式
依赖:classa中使用classb的属性或方法,叫a依赖b
目的:降低耦合度
原理:
xml解析、工厂模式、反射
2.ioc接口
3.ioc的bean管理
1》基于xml配置文件方式实现
2.基于xml方式注入属性
a.使用set方法注入
b.使用有参构造方法注入
===============================================================================================================
ioc的factoryBean:
1.spring 有俩种类型的bean: 一种普通bean 一种factoryBean(工厂bean)
2.普通bean:在配置文件中定义bean,class类型就是返回类型。
3.工厂bean:在配置文件中定义bean, 类型和返回类型可以不一致。
第一步:创建类,让这个类作为工厂bean,实现接口FactoryBean
第二部:实现接口中的方法,并定义bean的返回类型。
ioc中bean的作用域
ioc默认 创建 单实例 对象
作用域属性: scope: 默认- singleton -- 单实例
- prototype -- 多实例
- request (不常用)
- session (不常用)
ioc中bean的生命周期
ioc中bean的自动装配
ioc中bean管理的外部属性文件
如下示例:
===========================================================================================================
2》基于注解方式实现
AOP:
1.概念
2.底层原理:动态代理
1》.
第一种 有接口情况,使用 JDK 动态代理 ;创建接口实现类代理对象,增强类的方法
具体实现: 调用 newProxyInstance 方法,方法有三个参数:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
第一参数,类加载器
第二参数,增强方法所在的类,这个类实现的接口,支持多个接口
第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分
//(1)创建接口,定义方法
public interface UserDao {
public int add(int a,int b);
public String update(String id);
}
//(2)创建接口实现类,实现方法
public class UserDaoImpl implements UserDao {
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public String update(String id) {
return id;
}
}
//(3)使用 Proxy 类创建接口代理对象
public class JDKProxy {
public static void main(String[] args) {
//创建接口实现类代理对象
Class[] interfaces = {UserDao.class};
UserDaoImpl userDao = new UserDaoImpl();
/** 第一参数,类加载器
第二参数,增强方法所在的类,这个类实现的接口,(支持多个接口)
第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分 */
UserDao dao =(UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces,
new UserDaoProxy(userDao));
int result = dao.add(1, 2);
System.out.println("result:"+result);
}
}
//创建代理对象代码
class UserDaoProxy implements InvocationHandler {
//1 把创建的是谁的代理对象,把谁传递过来
//有参数构造传递
private Object obj;
public UserDaoProxy(Object obj) {
this.obj = obj;
}
//增强的逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法之前
System.out.println("方法之前执行...."+method.getName()+" :传递的参数..."+ Arrays.toString(args));
//被增强的方法执行
Object res = method.invoke(obj, args);
//方法之后
System.out.println("方法之后执行...."+obj);
return res;
}
}
2》.没有接口情况,cglib动态代理
创建当前类的子类的代理对象。
==========================================================================================================================
AOP(术语)
a)连接点:类里面哪些方法可以被增强,这些方法称为连接点
b)切入点:实际被真正增强的方法称为切入点
c)通知(增强):实际增强的逻辑部分称为通知,且分为以下五种类型:
1)前置通知 2)后置通知 3)环绕通知 4)异常通知 5)最终通知
d)切面:把通知应用到切入点过程
2、aop 面向切面编程
aop的实现原理是动态代理:
1、jdk动态代理:JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。
2、CGLIB动态代理:是一个代码生成的类库,可以在运行时动态的生成某个类的子类。
CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final
,那么它是无法使用CGLIB做动态代理的。