当前位置: 首页 > 科技观察

Java框架篇---springaop的两种配置方式

时间:2023-03-12 13:10:21 科技观察

***:注解配置AOP注解配置AOP(使用AspectJ类库实现),大致分为三步:1.使用注解@Aspect定义Aspect,定义切面中的入口点(@Pointcut)和通知类型(@Before,@AfterReturning,@After,@AfterThrowing,@Around)。2.开发需要拦截的类。3.将aspect配置成xml,当然我们也可以使用自动扫描bean的方式。在这种情况下,它将由SpringAoP容器管理。其他需要引用aspectJ的jar包:aspectjweaver.jaraspectjrt.jar实例:User.javapackagecom.bjsxt.model;publicclassUser{privateStringusername;privateStringpassword;publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.username=username;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}}/***接口类*/packagecom.bjsxt.dao;importcom.bjsxt.model.User;publicinterfaceUserDAO{publicvoidsave(Useruser);}现实接口:packagecom.bjsxt.dao.impl;importorg.springframework.stereotype.Component;importcom.bjsxt.dao.UserDAO;importcom.bjsxt.model.User;@Component("u")publicclassUserDAOImplimplementsUserDAO{publicvoidsave(Useruser){System.out.println("usersave11d!");/*thrownewRuntimeException("exception");*///抛异常}}操作类:packagecom.bjsxt.service;importjavax.annotation.Resource;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.stereotype.Component;importcom.bjsxt.dao.UserDAO;importcom.bjsxt.model.User;@Component("userService")publicclassUserService{privateUserDAOuserDAO;publicvoidinit(){System.out.println("init");}publicvoidadd(Useruser){userDAO.save(user);}publicUserDAOgetUserDAO(){returnuserDAO;}@Resource(name="u")publicvoidsetUserDAO(UserDAOuserDAO){this.userDAO=userDAO;}publicvoiddestroy(){System.out.println("destroy");}}加入aoppackagecom.bjsxt.aop;importorg.aspectj.lang.annotation.After;importorg.aspectj.lang.annotation.AfterReturning;importorg.aspectj.lang.annotation.AfterThrowing;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.annotation.Before;importorg.aspectj.lang.annotation.Pointcut;importorg.springframework.stereotype.Component;@Aspect@ComponentpublicclassLogInterceptor{@Pointcut("执行(公共*com.bjsxt.service..*.add(..))")publicvoidmyMethod(){};/*@Before("执行(publicvoidcom.bjsxt.dao.impl.UserDAOImpl.save(com.bjsxt.model.User))")*/@Before("myMethod()")publicvoidbefore(){System.out.println("methodstaet");}@After("myMethod()")publicvoidafter(){System.out.println("methodafter");}@AfterReturning("执行(public*com.bjsxt.dao..*.*(..))")publicvoidAfterReturning(){System.out.println("methodAfterReturning");}@AfterThrowing("执行(public*com.bjsxt.dao..*.*(..))")publicvoidAfterThrowing(){System.out.println("methodAfterThrowing");}}配置文件测试类:packagecom.bjsxt.service;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importcom.bjsxt。model.User;//DependencyInjection//InverseofControlpublicclassUserServiceTest{@TestpublicvoidtestAdd()throwsException{ClassPathXmlApplicationContextctx=newClassPathXmlApplicationContext("applicationContext.xml");UserServiceservice=(UserService)ctx.getBean("userService");System.out.println(service.getClass());service.add(newUser());System.out.println("###");ctx.destroy();}}结果:classcom.bjsxt.service.UserService$$EnhancerByCGLIB$$7b201784methodstaetusersave11d!methodAfterReturningmethodafter###注:@Aspect:表示该类是切面类@Componet:因为需要Spring管理作为一个切面类,所以需要在初始化的时候将这个类加入到Spring管理中;@Befoe:入口点的逻辑(Advice)执行...:入口点语法#p#第二种:xml配置aop实例同上:只是配置文件不同下面的是spring配置标签,bean中的几个重要属性:  xmlns:  是默认的XML文档解析格式,即springbean的地址为http://www.springframework.org/schema/beans。  通过设置该属性,所有在bean中声明的属性都可以通过<>直接使用,比如等。  xmlns:xsi:  是xml需要遵守的规范。通过URL可以看出。是w3的统一规范。稍后,xsi:schemaLocation用于定位所有解析文件。  xmlns:aop:  这里是重点,是我们这里需要用到的一些语义规范,和面向切面的AOP有关。  xmlns:tx:  Spring中事务相关的配置内容。  一个XML文件只能声明一个默认的语义分析规范。  比如上面的xml中,只有bean是默认的,其他的需要通过特定的标签来使用,比如aop,它有很多属性。如果要使用,必须在前面加上aop:xxx。能。比如上面的aop:config。  同理,如果默认的xmlns配置了aop相关的语义分析规范,那么config标签可以直接写在xml中。