Spring的AOP(千鋒)

package com.qfedu.aop01;

import org.junit.Test;

public class TestAOP01 {

? ? public void testUserService(){

? ? ? ? IUserService us = new UserservcieImpl();

? ? ? ? System.out.println(us.getAllUser());

? ? ? ? System.out.println(us.updateUser(new Object()));

? ? ? ? System.out.println(us.deleteUser(1));

? ? ? ? System.out.println(us.saveUser(new Object()));

? ? ? ? System.out.println("===============");

? ? ? ? IUserService us2 = UserFactory.getUserService();

? ? ? ? System.out.println(us2.getAllUser());

? ? ? ? System.out.println(us2.updateUser(new Object()));

? ? ? ? System.out.println(us2.deleteUser(2));

? ? ? ? System.out.println(us2.saveUser(new Object()));

? ? }

}

Days13Spring的AOP

區(qū)分三個概念

? ? 類闻牡, 對象只盹, 類對象

User u = new User();

User為一個類

u為一個User類的對象

User.class是User的類對象

AOP01

IUserService.java

package com.qfedu.aop01;

import java.util.List;

public interface IUserService<T> {

? ? /**

? ? * 獲取所有的用戶對象列表

? ? * @return

? ? */

? ? List<T> getAllUser();

? ? /**

? ? * 保存用戶

? ? * @param user

? ? * @return

? ? */

? ? boolean saveUser(T user);

? ? /**

? ? * 根據(jù)用戶uid刪除該uid對應(yīng)的用戶信息

? ? * @param uid

? ? * @return

? ? */

? ? boolean deleteUser(int uid);

? ? /**

? ? * 更新指定用戶信息

? ? * @param obj

? ? * @return

? ? */

? ? boolean updateUser(T obj);

}

UserServiceImpl.java

package com.qfedu.aop01;

import java.util.ArrayList;

import java.util.List;

public class UserservcieImpl implements IUserService<Object> {

? ? @Override

? ? public List<Object> getAllUser() {

? ? ? ? System.out.println("--------getAllUser----------");

? ? ? ? return new ArrayList<>();

? ? }

? ? @Override

? ? public boolean saveUser(Object user) {

? ? ? ? System.out.println("--------saveUser----------");

? ? ? ? return true;

? ? }

? ? @Override

? ? public boolean deleteUser(int uid) {

? ? ? ? System.out.println("--------deleteUser----------");

? ? ? ? return false;

? ? }

? ? @Override

? ? public boolean updateUser(Object obj) {

? ? ? ? System.out.println("--------updateUser----------");

? ? ? ? return true;

? ? }

}

MyAspect.java

package com.qfedu.aop01;

public class MyAspect {

? ? public void before(){

? ? ? ? System.out.println("********before**********");

? ? }

? ? public void after(){

? ? ? ? System.out.println("********after**********");

? ? }

}

UserFactory.java

package com.qfedu.aop01;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

public class UserFactory {

? ? public static IUserService getUserService(){

? ? ? ? IUserService us = new UserservcieImpl();

? ? ? ? MyAspect ma = new MyAspect();

? ? ? ? /**

? ? ? ? *

? ? ? ? *? 使用Proxy類的靜態(tài)方法newProxyInstance來實現(xiàn)對于目標(biāo)對象us的代理

? ? ? ? *? 目的是在原本us可以做的事情之前和之后可以做額外的事情

? ? ? ? *

? ? ? ? */

? ? ? ? IUserService ius = (IUserService) Proxy.newProxyInstance(UserFactory.class.getClassLoader(), us.getClass().getInterfaces(), new InvocationHandler() {

? ? ? ? ? ? /**

? ? ? ? ? ? * 代理對象調(diào)用的回掉方法

? ? ? ? ? ? * @param proxy 代理對象

? ? ? ? ? ? * @param method 被代理的方法

? ? ? ? ? ? * @param args 被代理方法的參數(shù)列表對象

? ? ? ? ? ? * @return 每個方法的最終返回值

? ? ? ? ? ? * @throws Throwable

? ? ? ? ? ? */

? ? ? ? ? ? @Override

? ? ? ? ? ? public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

? ? ? ? ? ? ? ? ma.before();

? ? ? ? ? ? ? ? System.out.println("000000000" + method);

? ? ? ? ? ? ? ? System.out.println("000001111" + args);

? ? ? ? ? ? ? ? Object obj = method.invoke(us, args);

? ? ? ? ? ? ? ? ma.after();

? ? ? ? ? ? ? ? System.out.println("111111111" + obj);

? ? ? ? ? ? ? ? return obj;

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? return ius;

? ? }

}

TestAOP01.java

package com.qfedu.aop01;

import org.junit.Test;

public class TestAOP01 {

? ? @Test

? ? public void testUserService(){

? ? ? ? IUserService us = new UserservcieImpl();

? ? ? ? System.out.println(us.getAllUser());

? ? ? ? System.out.println(us.updateUser(new Object()));

? ? ? ? System.out.println(us.deleteUser(1));

? ? ? ? System.out.println(us.saveUser(new Object()));

? ? ? ? System.out.println("===============");

? ? ? ? IUserService us2 = UserFactory.getUserService();

? ? ? ? System.out.println(us2.getAllUser());

? ? ? ? System.out.println(us2.updateUser(new Object()));

? ? ? ? System.out.println(us2.deleteUser(2));

? ? ? ? System.out.println(us2.saveUser(new Object()));

? ? }

}

AOP02

IUserService.java

package com.qfedu.aop02;

import java.util.List;

public interface IUserService<T> {

? ? /**

? ? * 獲取所有的用戶對象列表

? ? * @return

? ? */

? ? List<T> getAllUser();

? ? /**

? ? * 保存用戶

? ? * @param user

? ? * @return

? ? */

? ? boolean saveUser(T user);

? ? /**

? ? * 根據(jù)用戶uid刪除該uid對應(yīng)的用戶信息

? ? * @param uid

? ? * @return

? ? */

? ? boolean deleteUser(int uid);

? ? /**

? ? * 更新指定用戶信息

? ? * @param obj

? ? * @return

? ? */

? ? boolean updateUser(T obj);

}

UserServiceImpl.java

package com.qfedu.aop02;

import java.util.ArrayList;

import java.util.List;

public class UserServiceImpl<T> implements IUserService<T> {

? ? @Override

? ? public List<T> getAllUser() {

? ? ? ? System.out.println("--------getAllUser----------");

? ? ? ? return new ArrayList<>();

? ? }

? ? @Override

? ? public boolean saveUser(T user) {

? ? ? ? System.out.println("--------saveUser----------");

? ? ? ? return true;

? ? }

? ? @Override

? ? public boolean deleteUser(int uid) {

? ? ? ? System.out.println("--------deleteUser----------");

? ? ? ? return false;

? ? }

? ? @Override

? ? public boolean updateUser(T obj) {

? ? ? ? System.out.println("--------updateUser----------");

? ? ? ? return true;

? ? }

}

MyAspect.java

package com.qfedu.aop02;

public class MyAspect {

? ? public void before(){

? ? ? ? System.out.println("********before**********");

? ? }

? ? public void after(){

? ? ? ? System.out.println("********after**********");

? ? }

}

UserFactory.java

package com.qfedu.aop02;

import org.springframework.cglib.proxy.Enhancer;

import org.springframework.cglib.proxy.MethodInterceptor;

import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class UserFactory {

? ? /**

? ? * 使用Spring中的一個增強類來實現(xiàn)aop方式

? ? *? ? ? 1.? 創(chuàng)建Enhancer對象

? ? *? ? ? 2.? 設(shè)置增強類Enhancer的superClass

? ? *? ? ? 3.? 設(shè)置Enhancer對象的回調(diào)

? ? *? ? ? 4.? 通過eh對象的create()方法來得到指定的對象

? ? * @return

? ? */

? ? public static IUserService getUserService(){

? ? ? ? //? 1.? 創(chuàng)建Enhancer對象

? ? ? ? Enhancer eh = new Enhancer();

? ? ? ? //? 2.? 設(shè)置增強類Enhancer的superClass

? ? ? ? eh.setSuperclass(IUserService.class);

? ? ? ? IUserService<Object> us = new UserServiceImpl<>();

? ? ? ? MyAspect ma = new MyAspect();

? ? ? ? //? 3.? 設(shè)置Enhancer對象的回調(diào)

? ? ? ? eh.setCallback(new MethodInterceptor() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

? ? ? ? ? ? ? ? ma.before();

? ? ? ? ? ? ? ? Object obj = method.invoke(us, objects);

? ? ? ? ? ? ? ? ma.after();

? ? ? ? ? ? ? ? return obj;

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? //? 4.? 通過eh對象的create()方法來得到指定的對象

? ? ? ? IUserService<Object> ius = (IUserService<Object>) eh.create();

? ? ? ? return ius;

? ? }

}

TestAOP02.java

package com.qfedu.aop02;

import org.junit.Test;

public class TestAOP02 {

? ? @Test

? ? public void testAOP02(){

//? ? ? ? IUserService<Object> us = new UserServiceImpl<>();

? ? ? ? Object o = new Object();

//? ? ? ? System.out.println(us.getAllUser());

//? ? ? ? System.out.println(us.saveUser(o));

//? ? ? ? System.out.println(us.deleteUser(1));

//? ? ? ? System.out.println(us.updateUser(o));

? ? ? ? System.out.println("==============");

? ? ? ? IUserService ius = UserFactory.getUserService();

? ? ? ? System.out.println(ius.getAllUser());

? ? ? ? System.out.println(ius.saveUser(o));

? ? ? ? System.out.println(ius.deleteUser(1));

? ? ? ? System.out.println(ius.updateUser(o));

? ? }

}

AOP03

beans.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"

? ? ? xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

? ? <bean id="us" class="com.qfedu.aop03.UserServiceImpl" />

? ? <bean id="my" class="com.qfedu.aop03.MyAspect" />

? ? <!--

? ? ? ? ProxyFactoryBean代理的FactoryBean對象胁塞,我們現(xiàn)在要代理的是us

? ? ? ? ? ? 包含四個屬性注入:

? ? ? ? ? ? ? ? 1.? interfaces: 接口對象們

? ? ? ? ? ? ? ? ? ? <list>

? ? ? ? ? ? ? ? ? ? ? ? <value>com.qfedu.aop03.IUserService</value>

? ? ? ? ? ? ? ? ? ? ? ? <value>com.qfedu.aop03.IUserService</value>

? ? ? ? ? ? ? ? ? ? ? ? <value>com.qfedu.aop03.IUserService</value>

? ? ? ? ? ? ? ? ? ? </list>

? ? ? ? ? ? ? ? 2.? target:目標(biāo)對象,哪個對象將被以代理的方式創(chuàng)建

? ? ? ? ? ? ? ? 3.? interceptorNames:攔截對象的名稱腊尚,自定義的MethodInterceptor對象机错,注意它的包結(jié)構(gòu)組成

? ? ? ? ? ? ? ? 4.? optimize:boolean類型的值:

? ? ? ? ? ? ? ? ? ? ? ? true:強制使用cglib的動態(tài)代理方式

? ? ? ? ? ? ? ? ? ? ? ? false:使用jdk自帶的動態(tài)代理

? ? ? ? ? ? ? ? ? ? ? ? cglib:code generation library枪眉,代碼生成庫狸驳,性能更高

? ? -->

? ? <bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">

? ? ? ? <property name="interfaces" value="com.qfedu.aop03.IUserService" />

? ? ? ? <property name="target" ref="us" />

? ? ? ? <property name="interceptorNames" value="my" />

? ? ? ? <property name="optimize" value="true" />

? ? </bean>

</beans>

IUserService.java

package com.qfedu.aop03;

import java.util.List;

public interface IUserService {

? ? /**

? ? * 獲取所有的用戶對象列表

? ? * @return

? ? */

? ? List<Object> getAllUser();

? ? /**

? ? * 保存用戶

? ? * @param user

? ? * @return

? ? */

? ? boolean saveUser(Object user);

? ? /**

? ? * 根據(jù)用戶uid刪除該uid對應(yīng)的用戶信息

? ? * @param uid

? ? * @return

? ? */

? ? boolean deleteUser(int uid);

? ? /**

? ? * 更新指定用戶信息

? ? * @param obj

? ? * @return

? ? */

? ? boolean updateUser(Object obj);

}

UserServiceImpl.java

package com.qfedu.aop03;

import org.springframework.context.ApplicationContext;

import java.util.ArrayList;

import java.util.List;

public class UserServiceImpl implements IUserService {

? ? ApplicationContext ac;

? ? @Override

? ? public List<Object> getAllUser() {

? ? ? ? System.out.println("--------getAllUser----------");

? ? ? ? return new ArrayList<>();

? ? }

? ? @Override

? ? public boolean saveUser(Object user) {

? ? ? ? System.out.println("--------saveUser----------");

? ? ? ? return true;

? ? }

? ? @Override

? ? public boolean deleteUser(int uid) {

? ? ? ? System.out.println("--------deleteUser----------");

? ? ? ? return false;

? ? }

? ? @Override

? ? public boolean updateUser(Object obj) {

? ? ? ? System.out.println("--------updateUser----------");

? ? ? ? return true;

? ? }

}

MyAspect.java

package com.qfedu.aop03;

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

public class MyAspect implements MethodInterceptor {

? ? private void before(){

? ? ? ? System.out.println("---------before----------");

? ? }

? ? private void after(){

? ? ? ? System.out.println("---------after----------");

? ? }

? ? @Override

? ? public Object invoke(MethodInvocation invocation) throws Throwable {

? ? ? ? before();

? ? ? ? //? 業(yè)務(wù)處理方法的調(diào)用

? ? ? ? Object obj = invocation.proceed();

? ? ? ? after();

? ? ? ? return obj;

? ? }

}

TestAOP03.java

package com.qfedu.aop03;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestAOP03 {

? ? @Test

? ? public void testAOP03(){

? ? ? ? ApplicationContext ac = new ClassPathXmlApplicationContext("com/qfedu/aop03/beans.xml");

? ? ? ? IUserService us = ac.getBean("proxy", IUserService.class);

? ? ? ? Object o = new Object();

? ? ? ? System.out.println(us.getAllUser());

? ? ? ? System.out.println(us.deleteUser(1));

? ? ? ? System.out.println(us.saveUser(o));

? ? ? ? System.out.println(us.updateUser(o));

? ? }

}`

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市役耕,隨后出現(xiàn)的幾起案子采转,更是在濱河造成了極大的恐慌,老刑警劉巖瞬痘,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件故慈,死亡現(xiàn)場離奇詭異,居然都是意外死亡框全,警方通過查閱死者的電腦和手機察绷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來津辩,“玉大人拆撼,你說我怎么就攤上這事〈兀” “怎么了闸度?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摹恨。 經(jīng)常有香客問我筋岛,道長,這世上最難降的妖魔是什么晒哄? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮肪获,結(jié)果婚禮上寝凌,老公的妹妹穿的比我還像新娘。我一直安慰自己孝赫,他們只是感情好较木,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著青柄,像睡著了一般伐债。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上致开,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天峰锁,我揣著相機與錄音,去河邊找鬼双戳。 笑死虹蒋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播魄衅,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼峭竣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晃虫?” 一聲冷哼從身側(cè)響起皆撩,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哲银,沒想到半個月后毅访,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡盘榨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年喻粹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片草巡。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡守呜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出山憨,到底是詐尸還是另有隱情查乒,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布郁竟,位于F島的核電站玛迄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏棚亩。R本人自食惡果不足惜蓖议,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望讥蟆。 院中可真熱鬧勒虾,春花似錦、人聲如沸瘸彤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽质况。三九已至愕宋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間结榄,已是汗流浹背中贝。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留潭陪,地道東北人雄妥。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓最蕾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親老厌。 傳聞我的和親對象是個殘疾皇子瘟则,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容