首先有一个接口
public interface EmployeeService {
Employee getEmployee(Provider provider) throws SQLException;
}
然后有两个实现类
@Service("EmployeeAService") public class EmployeeAServiceImpl implements EmployeeService { xxx }
@Service("EmployeeBService") public class EmployeeBServiceImpl implements EmployeeService { xxx }
某类
@Service
public class EmployeeServiceFactory implements ApplicationContextAware {
private ApplicationContext factory;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.factory = applicationContext;
}
//或者不用implements ApplicationContextAware直接使用
//@Autowired
//private ApplicationContext applicationContext;注入
public Employee getEmployee(Provider provider, Integer xx) throws SQLException {
switch (xx) {
case 1:
return this.factory.getBean(EmployeeAServiceImpl.class).getEmployee(provider);
default:
return this.factory.getBean(EmployeeBServiceImpl.class).getEmployee(provider);
}
}
}
若这样直接使用会报标题的错误
这是因为这里会使用jdk动态代理。原因是:如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
因为这样生成的类,名字是类似$Proxy75,因而会报不可用。
解决办法,可以加proxy-target-class="true"
强制使用CGLIB代理方式 如在applicationContex.xml文件中如下
<aop:aspectj-autoproxy proxy-target-class="true"/>
另一种方法是,
this.factory.getBean("EmployeeAService",EmployeeService.class).getEmployee(provider);
Arviiin 发布了45 篇原创文章 · 获赞 27 · 访问量 25万+ 私信 关注