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)對于目標對象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:目標對象,哪個對象將被以代理的方式創(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容