По какой-то причине не создается бин "guitaristOne", в книге возможно опечатка. Выбрасывается исключение IllegalStateException
IllegalStateException: Cannot convert value of type 'com.sun.proxy.$Proxy5 implementing pl.arlou.defaultapp.aop.Singer,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised,org.springframework.core.DecoratingProxy' to required type 'pl.arlou.defaultapp.aop.GrammyGuitarist' for property 'guitarist': no matching editors or conversion strategy found.
public class GuitaristDemo {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("app-context.xml");
Documentarist guitaristOne = ctx.getBean("guitaristOne", Documentarist.class);
System.out.println("Documentarist One >>");
guitaristOne.execute();
}
}
public interface Singer {
void sing();
void talk();
}
public class Guitar {
private String brand = " Martin";
public String play(){
return "G C G C Am D7";
}
public String getBrand(){
return brand;
}
public void setBrand(String brand){
this.brand = brand;
}
}
public class GrammyGuitarist implements Singer {
@Override
public void sing() {
System.out.println("Gravity is working against me and gravity wants to break me down");
}
@Override
public void talk() {
System.out.println("Guitarist talking");
}
public void sing(Guitar guitar){
System.out.println("play: " + guitar.play());
}
public void rest(){
System.out.println("zzz");
}
}
public class Documentarist {
private GrammyGuitarist guitarist;
public void execute(){
guitarist.sing();
guitarist.talk();
}
public void setGuitarist(GrammyGuitarist guitarist){
this.guitarist = guitarist;
}
}
public class AuditAdvice {
public void before(JoinPoint joinPoint) throws Throwable {
System.out.println("Executing before method: " + joinPoint.getSignature().getName());
}
public void after(JoinPoint joinPoint) throws Throwable {
System.out.println("Executing after method: " + joinPoint.getSignature().getName());
}
}
Ну и сам XML-файл:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">
<!-- We don't need to this; This is required only in annotation based AOP support -->
<!-- <aop:aspectj-autoproxy /> -->
<aop:config>
<aop:pointcut id="singExecution" expression="execution(* pl.arlou.defaultapp.aop.Singer.sing(..))"/>
<aop:aspect ref="advice">
<aop:before method="before" pointcut-ref="singExecution"/>
<aop:after method="after" pointcut-ref="singExecution"/>
</aop:aspect>
</aop:config>
<bean id="advice" class="pl.arlou.defaultapp.aop.AuditAdvice"/>
<bean id="guitaristOne" class="pl.arlou.defaultapp.aop.Documentarist"
p:guitarist-ref="johnMayer"/>
<bean id="johnMayer" class="pl.arlou.defaultapp.aop.GrammyGuitarist"/>
</beans>
Ответы (1 шт):
Автор решения: Artur Kovalchuk
→ Ссылка
Spring AOP построен на интерфейсах по умолчанию.
Класс неправильный Documentarist
нужно поменять на
public class Documentarist {
private Singer guitarist;
public void execute(){
guitarist.sing();
guitarist.talk();
}
public void setGuitarist(Singer guitarist){
this.guitarist = guitarist;
}
}