spring中AOP和IOC
Spring:包容一切的框架核心:IOC和AOP
IOC:控制反转,也叫依赖注入
控制反转:将对象的控制权从代码移交给xml
控制反转为程序开发带来的好处是:对象统一管理,提高复用性,降低耦合
依赖注入:在xml中赋值
AOP:面向切面,在不影响原有代码基础上,直接在任意位置植入代码(功能)
AOP增强:1.前置:放在目标方法前面
2.后置:放在目标方法后面,异常时不会发生
3.环绕:包括前后置增强,且可以修改目标方法的返回值
4.异常抛出:放在try-catch中的catch中,异常时才会发生
5.最终:最后输出的方法(放在后置后面)
区别于后置:1.可以拿到返回值
2.报错时候,后置不会发生,最终会继续运行,相当于try-catch-final中的final
AOP增强类型的使用:
1.前置方法:*<aop:beforemethod="pre_study"pointcut-ref="target"/>
publicvoidpre_study(JoinPointjp){**在参数中导个包(importorg.aspectj.lang.JoinPoint;)
System.out.println("先预习!"+jp.getTarget().getClass());
}
jp.getTarget().getClass()获得地址信息
2.后置方法:*<aop:after-returningmethod="do_work"returning="result"pointcut-ref="target"/>
publicvoiddo_work(JoinPointjp,Objectresult){
System.out.println("学习完毕,返回值是"+result+",做上机练习!");
}
3.环绕方法:*<aop:aroundmethod="around"pointcut-ref="target"/>
publicObjectaround(ProceedingJoinPointpjp){
System.out.println("我是环绕增强的前置增强");
try{
Objectresult=pjp.proceed();//环绕增强的前置增强和后置增强的分界线
result="123";//可以自如的修改目标方法的返回值
System.out.println("我是环绕增强的后置增强");
returnresult;//完美的替换目标方法的返回值
}catch(Throwablee){
e.printStackTrace();
}
returnnull;
}
4.异常抛出方法:*<aop:after-throwingmethod="do_exception"throwing="e"pointcut-ref="target"/>
publicvoiddo_exception(JoinPointjp,Exceptione){
System.out.println("我是异常增强");
}
5.最终方法:*<aop:aftermethod="do_final"pointcut-ref="target"/>
publicvoiddo_final(JoinPointjp){
System.out.println("我是最终增强");
}
</div>
IOC实现依赖注入的方式:(注入值)
1.setter注入方式:
<propertyname="num"value="1001"></property>
<propertyname="name"value="张三"></property>//一个参数,对应一个property
2.构造注入:时效性好,没有注入灵活
前提:带参构造器
<constructor-argindex="0"value="张三">//一个参数,对应一个constructor-arg
</constructor-arg>顺序混淆时,index区分位置,0起始
3.p命名空间注入p:属性名="属性值"
头文件应用:
xmlns:p="http://www.springframework.org/schema/p"
<beanid="first"class="AOP.firstAOP"p:name="张三"p:age="23"p:email="[email protected]"/>
使用spring的好处:
1.不用new对象
2.生命周期从new到xml文件中去了
3.事务处理的特定功能能直接插入