了解Spring Aspectj创建动态代理
2015-12-23 17:03
621 查看
Demo介绍, King和Queen两人都要专心做自己的工作,但是整理床铺,穿衣服,吃饭等锁事不想自己弄,于是喊了四个侍女(Servant)来照顾;
2.创建侍女对象
3.创建代理人
4.ApplicationContext.xml
2.创建侍女对象
3.ApplicationContext.xml同上
2.创建侍女对象
3.ApplicationContext.xml
测试运行代码
附: jar包目录图
非配置方式
动态代理一:代理人安排King,Queen,Servant的事项顺序;
1.King和Queen对象public interface KingInterface { public void dowork(); }
@Component("king") public class King implements KingInterface{ @Override public void dowork() { System.out.println("King doing!"); } }
public interface QueenInterface { public void dowork(); }
import org.springframework.stereotype.Component; @Component("queen") public class Queen implements QueenInterface { public void dowork(){ System.out.println("queen doing...."); } }
2.创建侍女对象
import org.springframework.stereotype.Component; @Component("servant01") public class Servant01{ public void makeBeds1(){ System.out.println("makeBeds1"); } public void makeBeds2(){ System.out.println("makeBeds2"); } }
import org.springframework.stereotype.Component; @Component("servant02") public class Servant02{ public void dress(){ System.out.println("dress"); } }
import org.springframework.stereotype.Component; @Component("servant03") public class Servant03{ public void haveAMeal1(){ System.out.println("haveAMeal1"); } public void haveAMeal2(){ System.out.println("haveAMeal2"); } }
import org.springframework.stereotype.Component; @Component("servant04") public class Servant04{ public void undress(){ System.out.println("undress"); } }
3.创建代理人
@Aspect @Component public class DynamicProxyFactory{ @Resource private Servant01 servant01; @Resource private Servant02 servant02; @Resource private Servant03 servant03; @Resource private Servant04 servant04; @Before("execution(* cn.com.xalead.spring.QueenInterface.*(..)) || execution(* cn.com.xalead.spring.KingInterface.*(..))") public void before() { servant01.makeBeds1(); servant02.dress(); servant03.haveAMeal1(); } @After("execution(* cn.com.xalead.spring.QueenInterface.*(..)) || execution(* cn.com.xalead.spring.KingInterface.*(..))") public void after(){ servant03.haveAMeal2(); servant01.makeBeds2(); servant04.undress(); } }
4.ApplicationContext.xml
<?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" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- 启用注解注入 --> <context:annotation-config/> <!-- 启用组件扫描 --> <context:component-scan base-package="cn.com.xalead"/> <!-- 启用aspectJ --> <aop:aspectj-autoproxy/> </beans>
动态代理二:Servant主动在King,Queen需要时做事;
1.King和Queen对象, 同上;2.创建侍女对象
import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; @Aspect @Component("servant01") public class Servant01 implements Ordered{ @Before("execution(* cn.com.xalead.spring.QueenInterface.*(..)) || execution(* cn.com.xalead.spring.KingInterface.*(..))") public void makeBeds1(){ System.out.println("makeBeds1"); } @After("execution(* cn.com.xalead.spring.QueenInterface.*(..)) || execution(* cn.com.xalead.spring.KingInterface.*(..))") public void makeBeds2(){ System.out.println("makeBeds2"); } @Override public int getOrder() { return 1; } }
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; @Aspect @Component("servant02") public class Servant02 implements Ordered{ @Before("execution(* cn.com.xalead.spring.QueenInterface.*(..)) || execution(* cn.com.xalead.spring.KingInterface.*(..))") public void dress(){ System.out.println("dress"); } @Override public int getOrder() { return 2; } }
import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; @Aspect @Component("servant03") public class Servant03 implements Ordered{ @Before("execution(* cn.com.xalead.spring.QueenInterface.*(..)) || execution(* cn.com.xalead.spring.KingInterface.*(..))") public void haveAMeal1(){ System.out.println("haveAMeal1"); } @After("execution(* cn.com.xalead.spring.QueenInterface.*(..)) || execution(* cn.com.xalead.spring.KingInterface.*(..))") public void haveAMeal2(){ System.out.println("haveAMeal2"); } @Override public int getOrder() { return 3; } }
import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; @Aspect @Component("servant04") public class Servant04 implements Ordered{ @After("execution(* cn.com.xalead.spring.QueenInterface.*(..)) || execution(* cn.com.xalead.spring.KingInterface.*(..))") public void undress(){ System.out.println("undress"); } @Override public int getOrder() { return 0; } }
3.ApplicationContext.xml同上
配置方式
1.King和Queen对象, 同上;2.创建侍女对象
import org.springframework.stereotype.Component; @Component("servant01") public class Servant01{ public void makeBeds(){ System.out.println("makeBeds"); } }
import org.springframework.stereotype.Component; @Component("servant02") public class Servant02{ public void dress(){ System.out.println("dress"); } }
import org.springframework.stereotype.Component; @Component("servant03") public class Servant03{ public void haveAMeal(){ System.out.println("haveAMeal"); } }
import org.springframework.stereotype.Component; @Component("servant04") public class Servant04{ public void undress(){ System.out.println("undress"); } }
3.ApplicationContext.xml
<?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" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- 启用注解注入 --> <context:annotation-config/> <!-- 启用组件扫描 --> <context:component-scan base-package="cn.com.xalead"/> <aop:config> <aop:pointcut expression="execution(* cn.com.xalead.spring.QueenInterface.*(..)) || execution(* cn.com.xalead.spring.KingInterface.*(..))" id="allMethod"/> <aop:aspect ref="servant01"> <aop:before method="makeBeds" pointcut-ref="allMethod"/> </aop:aspect> <aop:aspect ref="servant02"> <aop:before method="dress" pointcut-ref="allMethod"/> </aop:aspect> <aop:aspect ref="servant03"> <aop:before method="haveAMeal" pointcut-ref="allMethod"/> </aop:aspect> <aop:aspect ref="servant03"> <aop:after method="haveAMeal" pointcut-ref="allMethod"/> </aop:aspect> <aop:aspect ref="servant01"> <aop:after method="makeBeds" pointcut-ref="allMethod"/> </aop:aspect> <aop:aspect ref="servant04"> <aop:after method="undress" pointcut-ref="allMethod"/> </aop:aspect> </aop:config> </beans>
测试运行代码
import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; import junit.framework.TestCase; public class Test extends TestCase{ public void test1(){ BeanFactory factory = new ClassPathXmlApplicationContext("app*.xml"); QueenInterface queen = (QueenInterface)factory.getBean("queen"); queen.dowork(); System.out.println("----------------------------------------------"); KingInterface king = (KingInterface)factory.getBean("king"); king.dowork(); } }
附: jar包目录图
相关文章推荐
- 注册asp.net 4.0 到iis
- asp.net mvc3.0安装失败之终极解决方案
- casperjs爬虫总结 -- (2) casperjs
- ASP.NET地址栏form提交安全验证
- asp.net文件压缩,下载,物理路径,相对路径,删除文件
- 盘点 PHP 和 ASP.NET 的10大对比!
- Asp.Net MVC BundleConfig文件合并、压缩,网站优化加速
- 盘点 PHP 和 ASP.NET 的10大对比!
- 问题:asp.net 点击button按钮调到页面顶部;结果:asp.net点击一个按钮,使页面跳转到本面页上的指定位置
- C# 使用ffmpeg.exe进行音频转换完整demo-asp.net转换代码
- casperjs爬虫总结(1) -- 环境搭建
- asp.net中获取Layer弹出层返回值
- iis 配置 aspnet起始页
- SimpleMembership,成员资格提供程序、 通用的提供者和新的 ASP.NET 4.5 Web 窗体和 ASP.NET MVC 4 模板
- ASP.NET MVC下的异步Action的定义和执行原理
- MVC 各种传值方式 ASP.NET MVC view与controller传值方式
- ASP.NET C# 文件下载
- ASP.NET Boilerplate 深入系列之:概述
- asp.net 母版页使用详解
- asp.net 锚点