标签:
开始Spring AOP的小理解
拿一个小例子来说吧! 老师上课 这样的例子! 老师上课--就是一个核心的业务! 那么上课之前需要点名,天气太热,需要开空调!
这个时候,一个老师太多事就做不来了(不是做不来,我一个老师来教书,又不是来打杂的,我讲我的课 其他的我不管)!
那么问题就出现了,这个杂碎的事情谁去做呢! 好的,这个时候,应该有另一个老师或者学生负责点名,另一个人负责开关空调什么的! 老师就可以做到只讲课了!
这样,放到小例子来就是,我想要执行一个核心的业务,其他事情就交给拦截器来做吧! 在我的核心业务执行之前或者之后都可能会有相应的拦截器去做其他的事了!
public class DianMingAdvice implements MethodBeforeAdvice { /** * 点名类,增强 * * * 第一个参数是方法名,第二个参数是第一个参数方法的参数,第三个是代理对象 */ @Override public void before(Method method, Object[] arg1, Object target) throws Throwable { System.out.println("开始点名!!!"); System.out.println("调用的方法名:"+method.getName()); } }
我首先定义了一个老师专门在讲师讲课之前就执行的拦截器,等我的拦截器执行后,我再执行我的核心业务(讲课)
public class Teacher { public void teach(String teachName,String course) { System.out.println(teachName+"老师开始上课: "+course); } }
我的Spring XML的配置文件是这样的(Spring1.0)
<?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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <!-- 点名的老师类 --> <bean id="lin" class="com.advice.DianMingAdvice" /> <!-- 开空调的类 --> <bean id="wang" class="com.advice.OpenAdvice" /> <!-- 关空调的类 --> <bean id="zhang" class="com.advice.CloseAirconditionAdvice" /> <!-- 核心业务对象,教师类 --> <bean id="peng" class="com.test.Teacher" /> <!-- 利用Spring提供的代理对象,组装2对象,,target是一个代理 ref="peng" 是引用了这个类 --> <bean id="pengProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="peng"></property> <!-- 定义了所有要拦截核心业务的方法对象advice --> <property name="interceptorNames"> <!-- 具有顺序,因为XxxAdvice类所实现的接口的拦截顺序具有先后!XxxAdvice类所实现的接口相同那么就应该根据下列List中的顺序执行拦截 --> <list> <value>lin</value> <value>wang</value> <value>zhang</value> </list> </property> </bean> </beans>
以上的工作都做好以后! 测试一下
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TeacherTest { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); Teacher tc=(Teacher)context.getBean("pengProxy"); tc.teach("admin", "java"); } }
结果....开关空调的类没有放上来,跟点名的老师的类是一样的! 只是关闭空调的类的实现接口为AfterReturningAdvic--这是在下课后或者下课某一阶段(切点)执行的
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 开始点名!!! 调用的方法名:teach 开空调! admin老师开始上课: java 上完课后关空调!!!
不对之处,还望大牛指正
标签:
原文地址:http://www.cnblogs.com/yccmelody/p/5440928.html