姓名:黃於霞 班級:軟件151
1.引入Spring IOC的核心jar包,創建IOC的配置文件beans.xml,內容如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans.xsd"> 6 <!-- 被代理的目標對象 --> 7 <bean id="target" class="com.zhangguo.Spring041.aop06.Math"></bean> 8 <!--通知、橫切邏輯--> 9 <bean id="advice" class="com.zhangguo.Spring041.aop06.AfterAdvice"></bean> 10 <!--代理對象 --> 11 <!--interceptorNames 通知數組 --> 12 <!--p:target-ref 被代理的對象--> 13 <!--p:proxyTargetClass 被代理對象是否為一個類,如果是則使用cglib,否則使用jdk動態代理 --> 14 <bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean" 15 p:interceptorNames="advice" 16 p:target-ref="target" 17 p:proxyTargetClass="true"></bean> 18 </beans>
獲得代理類的實例並測試運行
1 package com.zhangguo.Spring041.aop06; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 public class Test { 7 8 @org.junit.Test 9 public void test01() 10 { 11 //容器 12 ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml"); 13 //從代理工廠中獲得代理對象 14 IMath math=(IMath)ctx.getBean("proxy"); 15 int n1=100,n2=5; 16 math.add(n1, n2); 17 math.sub(n1, n2); 18 math.mut(n1, n2); 19 math.div(n1, n2); 20 } 21 }
2.總結:
從容器中獲得proxy對象時應該是org.springframework.aop.framework.ProxyFactoryBean類型的對象(如下代碼所示),但這里直接就轉換成IMath類型了,這是因為:ProxyFactoryBean本質上是一個用來生產Proxy的FactoryBean。如果容器中的某個對象持有某個FactoryBean的引用它取得的不是FactoryBean本身而是 FactoryBean的getObject()方法所返回的對象。所以如果容器中某個對象依賴於ProxyFactoryBean那么它將會使用到 ProxyFactoryBean的getObject()方法所返回的代理對象這就是ProxyFactryBean得以在容器中使用的原因。