1.IOC和DI
IOC侧重的是思想 ,DI实现
IOC侧重构造对象:通过容器 DI对属性值进行注入 (普通属性和域属性的注入)
2.aop
第一个案例
1.增强:前置和后置
MethodBeforeAdvice AfterReturningAdvice 接口
before() afterRetruing()
2.增强也需要再xml中进行配置
3.AOP操作在配置文件中
<!--dao层的配置-->
<bean > int
4.方法签名
切入点表达式要匹配的对象就是目标方法的方法名。所以,execution表达式中明显就是方法的签名。
注意:表达式中加[]的部分表示可省略部分,各部分间用空格分开。在其中可以使用以下符号:
符号 意义
* 0至多个任意字符
.. 用在方法参数中,表示任意多个参数
用在包名后,表示当前包及其子包路径
+ 用在类名后,表示当前类及其子类
用在接口后,表示当前接口及其实现类
案例:
execution(public * *(..)) 指定切入点为:任意公共方法
execution(* set*(..)) 指定切入点为:任何一个以"set"开始的方法
5. 注入方式
1.设值注入
2.构造注入
条件1:带参构造 无参构造
条件2:
<bean >
ClassLoader loader, 类加载器(孙卫琴) 如何获取到类加载器?
Class<?>[] interfaces,
InvocationHandler h 调度处理器
CGLIB动态代理: 编译的时候
特点:再一个类型没有接口的情况下进行代理
实质:内存中构建了出了目标类型的子类
对于不使用接口的业务类,无法使用JDK动态代理,cglib采用非常底层的字节码技术,
可以为一个类创建子类
CGLIB动态代理 无接口代理 编译已经增强
final SomeServiceImpl service=new SomeServiceImpl();
Enhancer enhancer=new Enhancer();
enhancer.setSuperClass(service.getClass());
enhancer.setCallBack(new MethodInterceptor(){
public Object intercept(Object o,Method method,Object[] objects,MethodProxy methodProxy){
sout("before=========");
Object resullt=methodProxy.invoke(service,objects);
return result;
}
});
SomeServiceImpl proxy=(SomeServiceImpl)enhancer.create();
proxy.doSome();