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