• Aop编程注解与xml的实现


    一、注解方式

    1、首先引入spring对于aop编程的jar支持包,spring框架没有的包请自行在网上下载。

    aopalliance-alpha1.jar
    aspectjrt.jar
    aspectjweaver.jar
    spring-aop-4.3.2.RELEASE.jar

    2、在bean.xml中引入aop编程的名称空间。

    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    

    3、在bean.xml中开启注解方式和开启注解扫描。

    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    <context:component-scan base-package="cn.itcast.e_aop_anno"></context:component-scan>

    4、相关注解的解释

    @Aspect指定一个类为切面类	(声明这是一个切面)
    @Pointcut("execution(*包名.类名(可以用*代替包下的所有方法).*(..))")  指定切入点表达式
    @Before("pointCut_()")前置通知: 目标方法之前执行
    @After("pointCut_()")后置通知:目标方法之后执行(始终执行)
    @AfterReturning("pointCut_()")	 返回后通知: 执行方法结束前执行(异常不执行)
    @AfterThrowing("pointCut_()")	异常通知:  出现异常时候执行
    @Around("pointCut_()")环绕通知: 环绕目标方法执行
    

    5、在注解模式下可以使用接口或不适用接口,为方便说明首先创建一个接口

    public interface IUserDao {
    	void save();
    }
    

    6、实现接口的例子。

    @Component   // 加入容器
    public class UserDao implements IUserDao{
    	@Override
    	public void save() {
    		System.out.println("-----核心业务:保存!!!------"); 
    	}
    }
    

    7、不实现接口的例子。

    @Component   // 加入容器
    @Scope("prototype")
    public class OrderDao{
    	public void save() {
    		System.out.println("-----核心业务:保存!!!------");
    	}
    }
    

    8、切面类

    @Component // 加入容器
    @Aspect  // 指定当前类为切面类
    public class Aop {
    	// 指定切入点表单式: 拦截哪些方法; 即为哪些类生成代理对象
    	@Pointcut("execution(* 包名.*.*(..))")
    	public void pointCut_(){
    	}
    	
    	// 前置通知 : 在执行目标方法之前执行
    	@Before("pointCut_()")
    	public void begin(){
    		System.out.println("开始事务/异常");
    	}
    	
    	// 后置/最终通知:在执行目标方法之后执行  【无论是否出现异常最终都会执行】
    	@After("pointCut_()")
    	public void after(){
    		System.out.println("提交事务/关闭");
    	}
    	
    	// 返回后通知: 在调用目标方法结束后执行 【出现异常不执行】
    	@AfterReturning("pointCut_()")
    	public void afterReturning() {
    		System.out.println("afterReturning()");
    	}
    	
    	// 异常通知: 当目标方法执行异常时候执行此关注点代码
    	@AfterThrowing("pointCut_()")
    	public void afterThrowing(){
    		System.out.println("afterThrowing()");
    	}
    	
    	// 环绕通知:环绕目标方式执行
    	@Around("pointCut_()")
    	public void around(ProceedingJoinPoint pjp) throws Throwable{
    		System.out.println("环绕前....");
    		pjp.proceed();  // 执行目标方法
    		System.out.println("环绕后....");
    	}	
    }
    

    9、测试类。

    public class App {
    	ApplicationContext ac = new ClassPathXmlApplicationContext("包名/bean.xml");
    // 目标对象有实现接口,spring会自动选择“JDK代理” @Test public void testApp() { IUserDao userDao = (IUserDao) ac.getBean("userDao"); System.out.println(userDao.getClass()); userDao.save(); } // 目标对象没有实现接口, spring会用“cglib代理” @Test public void testCglib() { OrderDao orderDao = (OrderDao) ac.getBean("orderDao"); System.out.println(orderDao.getClass()); orderDao.save(); } @Deprecated // 共性问题:如果目标对象有实现接口,在从容器中获取目标对象的时候,只能通过接口接收对象。 public void testApp2() { // 错误代码: 只能用接口接收 UserDao userDao = (UserDao) ac.getBean("userDao"); System.out.println(userDao.getClass()); userDao.save(); } @Test public void testGetObj() throws Exception { OrderDao orderDao1 = (OrderDao) ac.getBean("orderDao"); OrderDao orderDao2 = (OrderDao) ac.getBean("orderDao"); System.out.println(orderDao1); System.out.println(orderDao2); } }

    二、xml方式

    1、首先引入spring对于aop编程的jar支持包,spring框架没有的包请自行在网上下载。

    2、在bean.xml中引入aop编程的名称空间。

    3、配置bean.xml。

         <!-- dao 实例 -->
    	<bean id="userDao" class="包名.UserDao"></bean>
    	<bean id="orderDao" class="包名.OrderDao"></bean>
    	
    	<!-- 切面类 -->
    	<bean id="aop" class="包名.Aop"></bean>
    	
    	<!-- Aop配置 -->
    	<aop:config>
    		<!-- 定义一个切入点表达式: 拦截哪些方法 -->
    		<aop:pointcut expression="execution(* 包名.*.*(..))" id="pt"/>
    		<!-- 切面 -->
    		<aop:aspect ref="aop">
    			<!-- 环绕通知 -->
    			<aop:around method="方法名" pointcut-ref="pt"/>
    			<!-- 前置通知: 在目标方法调用前执行 -->
    			<aop:before method="begin" pointcut-ref="pt"/>
    			<!-- 后置通知: -->
    			<aop:after method="after" pointcut-ref="pt"/>
    			<!-- 返回后通知 -->
    			<aop:after-returning method="afterReturning" pointcut-ref="pt"/>
    			<!-- 异常通知 -->
    			<aop:after-throwing method="afterThrowing" pointcut-ref="pt"/>
    		</aop:aspect>
    	</aop:config>
    

    4、切面类。

    // 切面类
    public class Aop {
    	
    	public void begin(){
    		System.out.println("开始事务/异常");
    	}
    	
    	public void after(){
    		System.out.println("提交事务/关闭");
    	}
    	
    	public void afterReturning() {
    		System.out.println("afterReturning()");
    	}
    	
    	public void afterThrowing(){
    		System.out.println("afterThrowing()");
    	}
    	
    	public void around(ProceedingJoinPoint pjp) throws Throwable{
    		System.out.println("环绕前....");
    		pjp.proceed();  // 执行目标方法
    		System.out.println("环绕后....");
    	}
    	
    }
    

    5、测试类。

    public class App {
    	ApplicationContext ac = new ClassPathXmlApplicationContext("包名/bean.xml");
    	// 目标对象有实现接口,spring会自动选择“JDK代理”
    	@Test
    	public void testApp() {
    		IUserDao userDao = (IUserDao) ac.getBean("userDao");
    		System.out.println(userDao.getClass());
    		userDao.save();
    	}
    	// 目标对象没有实现接口, spring会用“cglib代理”
    	@Test
    	public void testCglib() {
    		OrderDao orderDao = (OrderDao) ac.getBean("orderDao");
    		System.out.println(orderDao.getClass());
    		orderDao.save();
    	}
    }
  • 相关阅读:
    某些输入文件使用或覆盖了已过时的 API
    laravel 重写以及500错误
    Ubuntu镜像使用帮助
    E: Sub-process /usr/bin/dpkg returned an error code (1) 解决方案
    python请求java Selenium Webdriver
    Selenium Grid 简易安装
    selenium + python 添加等待时间
    selenium帮助手册以及 webdriver的各种driver
    thinkphp结合layui上传图片
    thinkphp----替换写标签的方法
  • 原文地址:https://www.cnblogs.com/imzhuo/p/5887741.html
Copyright © 2020-2023  润新知