如果对动态代理还未曾有一定的认识(下文会用到),请先看这篇:Java - 动态代理机制讲解(Proxy.newProxyInstance)
packagecom.imooc.ioc.demo3; publicinterfaceUserDao { publicvoidfindAll(); publicvoidsave(); publicvoidupdate(); publicvoiddelete(); } packagecom.imooc.ioc.demo3; publicclassUserDaoImplimplementsUserDao { @OverridepublicvoidfindAll() { System.out.println("查询用户。。。"); } @Overridepublicvoidsave() { System.out.println("保存用户。。。"); } @Overridepublicvoidupdate() { System.out.println("修改用户。。。"); } @Overridepublicvoiddelete() { System.out.println("删除用户。。。"); } }
packagecom.imooc.ioc.demo3; importorg.springframework.beans.BeansException; importorg.springframework.beans.factory.config.BeanPostProcessor; importjava.lang.reflect.InvocationHandler; importjava.lang.reflect.Method; importjava.lang.reflect.Proxy; publicclassMyBeanPostProcessorimplementsBeanPostProcessor { @OverridepublicObjectpostProcessBeforeInitialization(Objectbean, StringbeanName) throwsBeansException { System.out.println("第五步:初始化前方法..."); returnbean; } @OverridepublicObjectpostProcessAfterInitialization(finalObjectbean, StringbeanName) throwsBeansException { System.out.println("第八步:初始化后方法..."); if("userDao".equals(beanName)){ Objectproxy=Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), newInvocationHandler() { @OverridepublicObjectinvoke(Objectproxy, Methodmethod, Object[] args) throwsThrowable { if("save".equals(method.getName())){ System.out.println("权限校验==================="); returnmethod.invoke(bean,args); } returnmethod.invoke(bean,args); } }); returnproxy; } else{ returnbean; } } }
<beanclass="com.imooc.ioc.demo3.MyBeanPostProcessor"/><beanid="userDao"class="com.imooc.ioc.demo3.UserDaoImpl"/>
packagecom.imooc.ioc.demo3; importorg.junit.Test; importorg.springframework.context.ApplicationContext; importorg.springframework.context.support.ClassPathXmlApplicationContext; /*** Bean的作用范围的测试*/publicclassSpringDemo3 { @Testpublicvoiddemo3(){ ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml"); UserDaouserDao= (UserDao)applicationContext.getBean("userDao"); userDao.findAll(); userDao.save(); userDao.update(); userDao.delete(); } }
运行结果:第五步:初始化前方法... 第八步:初始化后方法... 查询用户。。。权限校验===================保存用户。。。修改用户。。。删除用户。。。