1. 程式人生 > >【Spring】- 介面代理、類代理

【Spring】- 介面代理、類代理

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

Spring通過介面代理能提高程式程式碼的靈活性,介面代理的四個步驟:

  • 配置被代理的目標類
  • 配置通知
  • 配置通知的作用切入點
  • 配置介面的代理物件(Spring預設為介面代理)

配置:

<?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:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!-- 配置目標物件 targetObject -->
<bean id="targetObject" class="com.zhiwei.target.TargetObject">
	<property name="name" value="name"/>
</bean>

<!-- 配置通知 -->
<bean id="myAdvice" class="com.zhiwei.advice.MyAdvice"/>

<!-- 
配置通知的切入點:
NameMatchMethodPointcutAdvisor:按照名稱匹配切入點(RegexpMethodPointcutAdvisor可以使用正則式匹配)
mappedNames:通知作用的切入點:支援ant格式的表達:sys*
注意:一個通知匹配一個切入點通知器
 -->
 <bean id="beforAdvicePacket" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
 <property name="advice" ref="myAdvice"/>
 <property name="mappedNames">
	 <list>
	 	<value>sayHello</value>
	 </list>
 </property>
 </bean>

<!-- 配置代理物件:
  proxyInterfaces:代理介面集:目標物件實現的介面
  target:被代理目標物件
  interceptorNames:攔截器名稱集合
  proxyTargetClass:是否開啟類代理
   -->
<bean id="proxyObject" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"> <!-- 被代理介面 -->
	<list>
		<value>com.zhiwei.target.TargetInter</value>
		<value>com.zhiwei.target.TargetInter01</value>
	</list>
</property>
<property name="target" ref="targetObject"/>  <!-- 目標物件 -->
<property name="interceptorNames"> <!-- 目標物件注入的通知 -->
	<list>
		<value>beforAdvicePacket</value>
	</list>
</property>
<property name="proxyTargetClass" value="true"/>
</bean>
</beans>

目標物件:

package com.zhiwei.target;
public class TargetObject implements TargetInter ,TargetInter01{
    
	private String name;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void sayHello() {

		System.out.println("Hello "+name);
	}

	@Override
	public void sayBye() {
		System.out.println("Bye "+name);
	}

}

目標物件實現介面:

package com.zhiwei.target;

public interface TargetInter01 {
  public void sayBye();
}

package com.zhiwei.target;

public interface TargetInter {
	
	public void sayHello();
}

測試類:

package com.zhiwei.target;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zhiwei.target.TargetInter;
import com.zhiwei.target.TargetInter01;
import com.zhiwei.target.TargetObject;


public class TestAOP {

	public static void main(String[] args) {
		
		ApplicationContext ac=new ClassPathXmlApplicationContext("com/zhiwei/target/applicationContext.xml");
		
		//使用IOC容器裡裡面的代理物件,預設介面代理
		TargetInter ti=(TargetInter) ac.getBean("proxyObject");
		System.out.println("預設介面代理");
		ti.sayHello();
	
		//因為是介面代理,介面指向同一個目標物件:	TargetInter01 ti01=(TargetInter01) ac.getBean("proxyObject");
		TargetInter01 ti01=(TargetInter01) ti;
		ti01.sayBye();
		
		//IOC配置開啟類代理
		TargetObject to=(TargetObject) ac.getBean("proxyObject");
		System.out.println("\n\nIOC配置為類代理");
		to.sayHello();
		to.sayBye();
	}
}

結果:

相關推薦

Spring- 介面代理代理

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

Python例項方法方法靜態方法之間區別(轉)

面相物件程式設計中,類方法和靜態方法是經常用到的兩個術語。 邏輯上講:類方法是隻能由類名呼叫;靜態方法可以由類名或物件名進行呼叫。 在C++中,靜態方法與類方法邏輯上是等價的,只有一個概念,不會混淆。 而在Python中,方法分為三類例項方法、類方法、靜態方法。程

Spring簡述@Configuration配置註冊BeanDefinition到Spring容器的過程

概述 本文以SpringBoot應用為基礎,嘗試分析基於註解@Configuration的配置類是如何向Spring容器註冊BeanDefinition的過程 其中主要分析了 ConfigurationClassPostProcessor 這個BeanDefinitionRegistryPostProcess

原始碼分析 | 手寫mybait-spring核心功能(乾貨好文一次學會工廠bean代理bean註冊的使用)

![](https://img2020.cnblogs.com/blog/2030202/202006/2030202-20200609215006431-1003784316.jpg) 作者:小傅哥 部落格:[https://bugstack.cn](https://bugstack.cn) - `彙總系

SpringAOP的代理預設是Jdk還是Cglib?

菜瓜:你覺得AOP是啥 水稻:我覺得吧,AOP是對OOP的補充。通常情況下,OOP程式碼專注功能的實現,所謂面向切面程式設計,大多數時候是對某一類物件的方法或者功能進行增強或者抽象 菜瓜:我看你這個理解就挺抽象的 水稻:舉個栗子

Spring16註解事務 @Transactional

引用 相關 連接池 每次 one 作用 事務性 簡單 這一 概述 事務管理對於企業應用來說是至關重要的,即使出現異常情況,它也可以保證數據的一致性。Spring Framework對事務管理提供了一致的抽象,其特點如下: 為不同的事務API提供一致的編程模型,

Spring27JPA 實現樂觀鎖@Version註解的使用

線程並發 基礎上 nal where 本質 項目需求 得到 業務 -s 持久層使用jpa時,默認提供了一個註解@Version來實現樂觀鎖 簡單來說就是用一個version字段來充當樂觀鎖的作用。先來設計實體類 /** * Created by xujingfeng on

013-Spring Boot web靜態資源ServletFilterlistenter

ces 其中 bean response cat 使用 修改配置 dac tostring 一、靜態資源 1.1、webapp默認支持靜態資源 在src/main/webapp下建立user.html默認支持訪問 1.2、默認內置靜態資源目錄。可被直接訪問 查看包:

springspirng中的常用工具

ren handle file 監控 拷貝 trac convert cas har 一、概述   很多時候,很多工具類其實spring中就已經提供,常用的工具類有:     參考:https://www.cnblogs.com/langtianya/p/3875103

PHP面向物件介面跟抽象的區別和各自的用法

author:咔咔 wechat:fangkangfk   介面: 介面是用interface宣告的 介面中定義的方法都是公共的 介面只需要宣告自定義方法不需要具體內容 實現介面使用implements實現,介面支援多實現,使用逗號隔開即可 繼承介面的類

CSS純CSS另思路代替displayvisibility解決子選單延遲消失

  在設計子選單時候,需要實現當滑鼠移動到選單時候,子選單顯示,否則子選單都處於隱藏狀態。實現這個功能使用js的話很簡單實現,但是我想用純CSS,使用純CSS的話,就會遇到滑鼠移開選單後,子選單就馬上消失了(display:noe或者visibility:hidden),就滑

Java設計模式之代理模式

代理模式是Java常見的設計模式之一。所謂代理模式是指客戶端並不直接呼叫實際的物件,而是通過呼叫代理,來間接的呼叫實際的物件。 代理模式的定義: 為其他物件提供一種代理,以控制對這個物件的訪問; 為其他物件提供一種代理以控制對這個物件的訪問。代理物件起到中介作用,可去掉功能

Linux時間日期搜尋查詢壓縮解壓常用指令小結

一、時間日期類 1.date指令(顯示當前日期)    用法:date:(完整的顯示當前時間)               date +%Y (顯示當前年份)     &nb

java核心36講介面和抽象的區別

回答 介面和抽象類是java面向物件設計的兩個基礎機制。 介面是對行為的抽象,他是抽象方法的集合,利用介面可以達到API定義和實現的分離。介面不能例項化/不能包含非常量成員,任何的feild都是預設public static final的意義;沒有非靜態方法的實現。 抽象

11. Java反射——動態代理

博主最近比較忙,爭取每週翻譯四篇。等不急的請移步原文網頁。  =====================================================================================

C#面對物件和構造方法及名稱空間

一、面向物件 1、什麼是面向物件? 面向物件是一種思想,面向物件是將功能等通過物件來實現,將功能封裝進物件之中,讓物件去實現具體的細節,在面向物件中,將資料作為第一位,而方法或者說是演算法作為其次,這是對資料的一種優化,操作起來更加方便,簡化了過程。 2、為什麼要用面向

HibernateHibernate的聚查詢分組查詢排序與時間之差

在Hibernate中的HQL語句其實能夠基本能夠實現SQL語句所做的事情,正如jQuery至於javascript一樣。雖然HQL語句是對類的查詢,但是HQL在實行聚類查詢、分組查詢、排序與時間之差等查詢,也無須把查詢結果查詢出來,再通過對List的處理才得到結果。 比如

Nginx基於TCP的反向代理

Nginx預設只支援http的反向代理,想要支援tcp的反向代理,需要在編譯時增加tcp代理模組【nginx_tcp_proxy_module】 一、安裝步驟: cd /app wget htt

Spring@Resource@Autowired和@Qualifer三者的區別

                 @Resource、@Autowired和@Qualifer三者的區別 Spring中以上三個註解可以用來實現依賴注入,但在使用時知道三者的區別與聯絡是比較重要的 @Resource使用注意事項 例: @Resource CityDa

Spring (AOP靜態代理動態代理

1. AOP 1.1 AOP簡介 AOP Aspect Oriented Programing 面向切面程式設計 AOP採取橫向抽取機制,取代了傳統縱向繼承體系重複性程式碼(效能監視、事務管理、安全檢查、快取) Spring中的Aop是純J