在applicationContext.xml配置文件中引入AOP约束后,想要进行Spring的AOP开发,还需要导入三个jar包,两个Spring的包和一个AspectJ的包。
spring-aop-5.1.5.RELEASE
spring-aspects-5.1.5.RELEASE
com.springsource.org.aspectj.weaver-1.6.8.RELEASE
首先定义一个需要被增强的类 ProductDaoImpl:
我们打算增强其中的save方法,在执行save方法前先进行一次权限校验,也就是前置通知。
public class ProductDaoImpl implements ProductDao {
@Override
public void save() {
System.out.println("保存商品");
}
@Override
public void update() {
System.out.println("修改商品");
}
@Override
public void find() {
System.out.println("查找商品");
}
@Override
public void del() {
System.out.println("删除商品");
}
}
再定义一个切面类,也就是通知所处的类,编写增强动作的逻辑方法,用来做权限校验功能 MyAspectXML :
public class MyAspectXML {
public void checkPri(){
System.out.println("权限校验");
}
}
然后在配置文件中,将这两个类交给Spring管理,注册bean标签。
这一步也可以在类上使用注解的方式完成,不过注解的话还需要在配置文件中增加组件扫描的配置。
bean标签的注册:
<bean id="ProductDao" class="SpringAopdemo.ProductDaoImpl"/>
<bean id="myAspect" class="SpringAopdemo.MyAspectXML"/>
同时,在配置文件中还要进行代理的配置,通过AOP的配置完成对目标类的代理:
代理的配置:
<!--配置代理,通过AOP的配置完成对目标类产生代理-->
<aop:config>
<!--通过表达式配置哪些类的哪些方法需要进行增强-->
<!-- * 代表任意返回值-->
<!-- .. 代表任意参数-->
<aop:pointcut id="pointcut1" expression="execution(* SpringAopdemo.ProductDaoImpl.save(..))"/>
<!--配置切面-->
<!--配置通知和切入点-->
<!--指定切面类,也就是增强方法的类-->
<aop:aspect ref="myAspect">
<!--配置通知(增强方法),和指定的切入点(被增强的方法)-->
<aop:before method="checkPri" pointcut-ref="pointcut1"></aop:before>
</aop:aspect>
</aop:config>
然后编写一个Junit的测试类,同时在这一步中完成Spring与Junit的整合。
目的是为了让Junit帮我们创建Spring工厂,不用每次写测试类的时候都需要去new applicationContext工厂类对象,我们只需要在测试类中定义对象成员,使用@Resource注解为其注入属性即可。
Spring与Junit的整合:
Spring与Junit整合,需要引入一个jar包
spring-test-5.1.5.RELEASE
同时编写一个测试类test,使用@RunWith 和 ContextConfiguration 类注解,自动为这个类生成一个Spring 工厂,然后就可以正常的在类中使用applicationContext工厂类获取bean对象了,或者适应@Resource 对对象成员进行属性注入。
test:
/*
* Spring整合junit测试单元
* 通过注解来加载xml配置文件,并且自动生成工厂,无需在单元中new工厂
* 只需在测试类中添加类的成员,并且使用@Resource注入属性即可
* */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class testdemo {
@Resource(name="ProductDao")
private ProductDao productDao;
@Test
public void test(){
productDao.save();
productDao.update();
productDao.del();
productDao.find();
}
}
最后运行测试类,输出结果如下: