1. 程式人生 > >Spring 面向切面 代理

Spring 面向切面 代理

Aop(Aspect Oriented Programming), 即面向切面程式設計,可以說是OOP的補充和完善,與OOP有些區別,

AOP技術恰恰相反,它利用一種稱為"橫面"的技術,剖解開封裝的物件內部,並將那些影響了多個類的公共行為封裝到一個可重用的模板,並將其命名為"Aspect",即切面,所謂"切面",簡單說就是那些與業務無關,卻為業務模板所公共呼叫的邏輯或責任封裝起來,便於減少系統的重複程式碼,降低模板之間的耦合度,並有利於未來的可操作性和可維護性。

給大家簡單介紹一下一種模式:代理模式,分別在java,spring

Java中的靜態代理模式:

實現步驟:

1 建立一個介面

package com.zking.proxy;

public interface Istr {
	
    public void sing();
}

2建立類實現介面

package com.zking.proxy;
/*
 * 明星類
 */
public class Lyf implements Istr{
	
	
	@Override
	public void sing() {
		System.out.println("這就是灌籃!");	
	}

}

3建立代理類實現介面(構造方法中要求傳入介面作為引數)

package com.zking.proxy;
/**
 * 
 * @author 助理類
 *
 */
public class  zxj  implements Istr{
	
    private Istr istr;
      
	public zxj(Istr istr) {
		super();
		this.istr = istr;
	}

	@Override
	public void sing() {
		istr.sing();
	}

}

4測試類呼叫代理類進行測試

package com.zking.proxy;

public class Temp {

	public static void main(String[] args) {
//		Istr lyf=new Lyf();
//		zxj n=new zxj(lyf);
//		n.sing();
//		Istr fz=new FZ();
//		zxj n1=new zxj(fz);
//		n1.sing();
		
	}
}

舉一個列子:明星,助理,具體明星,就是明星是一個介面,一個抽象類,助理去實現代理,讓某個具體明星實現代理的東西,

Spring 中的動態代理模式:

1建立一個介面

package com.zking.proxy3;

public interface Iperson {
	//睡覺的方法
     public void sleep();
     //add的方法
     public void personAdd();
}

2實現介面的類 XIaoMing類

package com.zking.proxy3;

public class XiaoMing implements Iperson{

	@Override
	public void sleep() {
	System.out.println("睡覺");
		
	}

	@Override
	public void personAdd() {
		System.out.println("add");
		
	}

	
}

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:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd">
<!-- 配置一個目標 -->		
<bean id="xm" class="com.zking.proxy3.XiaoMing"></bean>

<!-- 配置一個混合的代理 -->
<bean id="myproxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 引入目標 -->
<property name="target" ref="xm"></property>

<!-- 代理類的介面 -->
  <property name="proxyInterfaces">
  <list>
  <value>com.zking.proxy3.Iperson</value>
  </list>
  </property>
 
</bean>

</beans>

4測試類 

package com.zking.proxy3;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Temp3 {
	@Test
	public void SpringBean() {
     ApplicationContext ac= new ClassPathXmlApplicationContext("applicationContext.xml");
     Iperson ip=(Iperson) ac.getBean("myproxy");
     ip.sleep();
     //ip.personAdd();
	}
}

以上就是java的靜態代理,spring的動態代理。