用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");
原因:
在使用代理時,目標對象和代理對象都會實現共同的接口,但是也可以在各自的實際類中添加自己的方法和屬性,所以返回的代理對象只能由他們共同的接口引用,而不能使用實現了共同接口的目標對象的類來引用。