spring -6 補充:BeanPostProcessor實現aop編碼(基於JDK動態代理)
阿新 • • 發佈:2021-02-06
定義原始物件的方法
public interface IUserDao { public void save(Person person); public void query(String name); } public class UserDaoImpl implements IUserDao{ @Override public void save(Person person) { System.out.println("dao save..."); } @Override public void query(String name) { System.out.println("dao query name "+ name); } }
BeanPostProcessor的實現類
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ExtraFunction implements BeanPostProcessor { /** * 實現aop對原始物件的加工 * #########基於JDK動態代理 * @param bean spring框架將會把原物件傳入 * @param beanName spring建立原物件的id * @return 我們要返回代理物件(增強物件) * @throws BeansException */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { InvocationHandler handler = new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("proxy before real method executing..."); Object ret= method.invoke(bean,args); System.out.println("proxy after real method executing..."); return ret; } }; //返回的物件id還是那個id,但是物件變了。 // 通過動態代理獲得代理物件 return Proxy.newProxyInstance(ExtraFunction.class.getClassLoader(),bean.getClass().getInterfaces(),handler); } }
XML配置檔案中:
<bean id="extra" class="aop.ExtraFunction"></bean>
<bean id="userDao" class="core.UserDaoImpl"></bean>
test程式碼中:
/** * 測試:工廠得到代理物件 */ @org.junit.Test public void test5(){ ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml"); IUserDao userDao = (IUserDao) ctx.getBean("userDao"); userDao.query("jackson"); }
結果: