定义原始对象的方法
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");
}
结果: