spring aop & ioc 容器
Posted 宋坤明
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring aop & ioc 容器相关的知识,希望对你有一定的参考价值。
本系列
IOC 方式配置AOP
前提:先引入spring-context、cglib、aspectjweaver包
同样的例子 定义一个IHello的接口和一个Hello的实现类如下
package seven.com.seven.aop;
public interface IHello {
void say();
}
package seven.com.seven.aop;
public class Hello implements IHello {
@Override
public void say() {
System.out.println("hello word");
}
}
定义一个切面,切面包含 前置通知,后置通知,如下
package com.seven.aop;
import org.aspectj.lang.JoinPoint;
public class Advices {
public void before(JoinPoint joinPoint){
System.out.println("--------------advice before--------------");
}
public void after(JoinPoint joinPoint){
System.out.println("--------------advice after--------------");
}
}
bean文件配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id="hello" class="com.seven.aop.Hello"/>
<bean id="advice" class="com.seven.aop.Advices"/>
<!--AOP 配置
aop:config 所有AOP的配置都必须配置在这个节点里面
proxy-target-class:代表被代理的类是否为一个没有实现接口的类
true:没有实现接口,使用CGLIB做动态代理
false:实现接口,使用JDK做动态代理
aop:aspect 代表着一个切面,切面的定义不理解可以查看之前文章 <spring aop & jdk的动态代理>
aop:pointcut 代表着切点
aop:before 代表前置通知,指明切面要做的事情,因为切点+通知=切面
aop:after 代表后置通知
-->
<aop:config proxy-target-class="false">
<aop:aspect ref="advice">
<aop:pointcut id="pointcut" expression="execution(* com.seven.aop.Hello.*(..))"/>
<aop:before method="before" pointcut-ref="pointcut"/>
<aop:after method="after" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
</beans>
package com.seven.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("bean.xml");
IHello proxy = (IHello) ctx.getBean("hello");
proxy.say();
}
}
运行结果
--------------advice before--------------
hello word
--------------advice after--------------
总结
到这里我们整个AOP系列就结束了,写了六篇文章来讲述其中的知识点,现在做一个简单的梳理
首先什么是代理模式,为什么需要用动态代理,这是AOP的产生的前提
关于动态代理,常用的有JDK的动态代理和CGLIB的动态代理,他们的原理是什么,有什么不同
Spring Aop 的一些术语 切点、通知、切面、连接点、织入等是什么意思
Spring Aop 是如何和JDK动态代理、CGLIB动态代理结合的
工作中可能用的较多的是在Spring IOC 这个容器下使用AOP,其实AOP和Spring IOC容器本身是没有关系的,本篇我们又讲到Spring IOC是如何和AOP结合的
以上是关于spring aop & ioc 容器的主要内容,如果未能解决你的问题,请参考以下文章