如果对动态代理还未曾有一定的认识(下文会用到),请先看这篇:Java - 动态代理机制讲解(Proxy.newProxyInstance)
package com.imooc.ioc.demo3;
public interface UserDao {
public void findAll();
public void save();
public void update();
public void delete();
}
package com.imooc.ioc.demo3;
public class UserDaoImpl implements UserDao {
@Override
public void findAll() {
System.out.println("查询用户。。。");
}
@Override
public void save() {
System.out.println("保存用户。。。");
}
@Override
public void update() {
System.out.println("修改用户。。。");
}
@Override
public void delete() {
System.out.println("删除用户。。。");
}
}
package com.imooc.ioc.demo3;
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 MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("第五步:初始化前方法...");
return bean;
}
@Override
public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
System.out.println("第八步:初始化后方法...");
if("userDao".equals(beanName)){
Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("save".equals(method.getName())){
System.out.println("权限校验===================");
return method.invoke(bean,args);
}
return method.invoke(bean,args);
}
});
return proxy;
}
else{
return bean;
}
}
}
<bean class="com.imooc.ioc.demo3.MyBeanPostProcessor"/>
<bean id="userDao" class="com.imooc.ioc.demo3.UserDaoImpl"/>
package com.imooc.ioc.demo3;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Bean的作用范围的测试
*/
public class SpringDemo3 {
@Test
public void demo3(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao)applicationContext.getBean("userDao");
userDao.findAll();
userDao.save();
userDao.update();
userDao.delete();
}
}
运行结果:
第五步:初始化前方法...
第八步:初始化后方法...
查询用户。。。
权限校验===================
保存用户。。。
修改用户。。。
删除用户。。。