我是Spring框架的新手,正在尝试一些示例来理解AOP,这是我到目前为止所做的,但它不起作用。
问题是,当我向spring.xml添加<aop:aspectj-autoproxy />
时,我的构建失败,说无法使用空指针异常创建bean。
但是如果我在没有<aop:aspectj-autoproxy />
标记的情况下运行该应用,那么它运行正常但没有AOP。
以下是我项目的一些细节。
这里我有AopMain,它是运行的主要类, LoggingAspect我实际定义之前的方面 有两个型号Circle和Triangle 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>
我得到的错误如下:
Error creating bean with name 'triangle' defined in class path resource [Spring.xml]: Initialization of bean failed; nested exception is java.lang.NullPointerException
但是如果我尝试在Spring.xml中注释<aop:aspectj-autoproxy />
行并运行代码,它就可以创建bean。
请指导我,我错过了一些东西?有些图书馆还是某些图书馆冲突?
与<aop:aspectj-autoproxy />
答案 0 :(得分:0)
我认为你引用了来自https://javabrains.io/的代码,你的代码没有问题,因为我使用相同的代码完成了示例。
最初,我也面临同样的问题,但后来我提出了解决方案。
1]您需要在安装后安装 aspectj jar,您将获得:
i)aspectjrt.jar ii)aspectjtools.jar iii)aspectjweaver.jar ⅳ)org.aspectj.matcher.jar
2]现在我们需要使用aspectjrt.jar和aspectjweaver.jar
在您的代码中,您还包含了aspectj.jar,这是不需要的,还有一个 aspectj.jar和aspectjrt.jar版本不同不包括aspectjrt.jar和aspectjweaver .jar直接来自互联网。
安装aspectj.jar,然后包含aspectj
的bin文件夹中的两个jar答案 1 :(得分:-2)
请更改
<aop:aspectj-autoproxy/>
到
<aop:aspectj-autoproxy ></aop:aspectj-autoproxy>
spring.xml 文件中的。希望它可以正常工作。