用spring获取bean的时候遇到代理对象不能转化为本类对象的问题
HelloService hello = (HelloService) application.getBean("helloService");
这个是 HelloService 实现 IhelloService接口
public class HelloService implements IhelloService{
@Override
public void sayHello(){
System.out.println("Hello Spring!!!");
}
}
HelloService创建代理
public class MyBeanPostProcessor implements BeanPostProcessor{
@Override
public Object postProcessAfterInitialization(final Object bean, String beanName)
throws BeansException {
if("helloService".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(method.getName().equals("sayHello")){
System.out.println("在sayHhello之前啊啊!!!");
Object res = method.invoke(bean, args);
return res;
}
return method.invoke(bean, args);
}
});
return proxy;
}
return bean;
}
解决办法:将返回的代理对象强转成代理类的接口才行!
IhelloService hello = (IhlloService) application.getBean("helloService");
原因:
在使用代理时,目标对象和代理对象都会实现共同的接口,但是也可以在各自的实际类中添加自己的方法和属性,所以返回的代理对象只能由他们共同的接口引用,而不能使用实现了共同接口的目标对象的类来引用。