Я новичок в Spring Framework и пытался попробовать несколько примеров, чтобы понять АОП, и вот что я делал до сих пор, но не работал.AOP с использованием AspectJ, не работающего с <aop: aspectj-autoproxy />
Проблема возникает, как только я добавляю <aop:aspectj-autoproxy />
в spring.xml. Моя сборка не отвечает, что не может создать bean-элемент с исключением из null-указателя. Но если я запустил приложение без тега <aop:aspectj-autoproxy />
, тогда он отлично работает , но без АОП.
Вот несколько деталей моего проекта.
Здесь я AopMain, который является основным классом, работает, LoggingAspect Где я фактически определил до того аспекта Есть две модели Окружность и треугольник ShapeService который фактически использует две вышеупомянутые модели
И Здесь я даю код для них
AopMain:
package com.spring.aop;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.service.ShapeService;
public class AopMain {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring.xml");
ShapeService shapeService = ctx.getBean("shapeService", ShapeService.class);
System.out.println(shapeService.getCircle().getName());
}
}
LoggingAspect:
package com.spring.aspect;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class LoggingAspect {
@Before("execution(public String getName())")
public void loggingAdvice(){
System.out.println("Advice run, Get method called");
}
}
Круг:
package com.spring.model;
public class Circle {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
треугольник: То же, что круг с одним атрибутом имени
ShapeService:
package com.spring.service;
import com.spring.model.Circle;
import com.spring.model.Triangle;
public class ShapeService {
private Circle circle;
private Triangle triangle;
public Circle getCircle() {
return circle;
}
public void setCircle(Circle circle) {
this.circle = circle;
}
public Triangle getTriangle() {
return triangle;
}
public void setTriangle(Triangle triangle) {
this.triangle = triangle;
}
}
И теперь здесь приходит важный файл Spring.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<aop:aspectj-autoproxy />
<bean name="triangle" class="com.spring.model.Triangle">
<property name="name" value="Triagnle Name"/>
</bean>
<bean name="circle" class="com.spring.model.Circle">
<property name="name" value="Circle Name"/>
</bean>
<bean name="shapeService" class="com.spring.service.ShapeService" autowire="byName" />
<bean name="loggingAspect" class="com.spring.aspect.LoggingAspect"/>
</beans>
Am получаю ошибку следующим образом:
Error creating bean with name 'triangle' defined in class path resource [Spring.xml]: Initialization of bean failed; nested exception is java.lang.NullPointerException
Но если я попытаюсь прокомментировать <aop:aspectj-autoproxy />
линию в Spring.xml и запустить код он может создать компонент. Прошу вас, я пропустил кое-что? В какой-то библиотеке или в какой-то библиотечный конфликт?
что-то делать с <aop:aspectj-autoproxy />
Для начала вы смесительных версии AspectJ не делают этого. Далее вам также понадобится cglib, так как у вас нет интерфейсов, а динамические прокси jdk не будут применяться. Наконец, вы используете довольно старую версию Spring Spring, предлагающую перейти на версию 4.x. –