zoukankan      html  css  js  c++  java
  • AOP:spring 的Annotation配置

    1.文件目录:

    2.实体类

    package com.wangcf.po;
    
    public class User {
        private int id;
        private String name;
        private String password;
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
    }

    3.接口:

    package com.wangcf.manager;
    
    import com.wangcf.po.User;
    
    
    public interface IUserManager {
        
        public void addUser();
        
        public void addUser(User user);
        public void delUser(int uid);
        
        public User modifyUser(User user);
    }

    4.实现类:

    package com.wangcf.manager;
    
    import com.wangcf.po.User;
    
    
    public class UserManagerImp implements IUserManager{
    
        @Override
        public void addUser() {
            // TODO Auto-generated method stub
            System.out.println("UserManagerImp addUser..");
        }
    
        @Override
        public void delUser(int uid) {
            // TODO Auto-generated method stub
            System.out.println("UserManagerImp delUser..");
        }
    
        @Override
        public User modifyUser(User user) {
            // TODO Auto-generated method stub
            user.setName(user.getName()+",修改后的");
            System.out.println("UserManagerImp modifyUser..");
            return null;
        }
    
        @Override
        public void addUser(User user) {
            // TODO Auto-generated method stub
            System.out.println("UserManagerImp addUser(User user)...");
        }
    
    }

    5.切面:

    package com.wangcf.manager.aspect;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    
    @Aspect
    /**
     * 切面类
     * @author fan
     *
     */
    public class LogManager {
        @Before("execution(public void com.wangcf.manager.UserManagerImp.addUser())")
        /*addUser(..)表示带参数或不带参数
         * add*() 可以用通配符进行修饰
         * execution为切入点的指示符,还有其他的
         * advice(通知)
         */
        public static void addLogBefore(){
            System.out.println("添加日志 Before...");
        }
        
        @After("execution(* com.wangcf.manager.*.*(..))")
        public void addLogAfter(){
            System.out.println("添加日志记录 After...");
        }
        
        @AfterReturning("execution(* com.wangcf.manager.*.*(..))")
        public void addLogAfterReturning(){
            System.out.println("添加日志记录 AfterReturning...");
        }
        
        @AfterThrowing("execution(* com.wangcf.manager.*.*(..))")
        public void addLogAfterThrowing(){
            System.out.println("添加日志记录 AfterThrowing...");
        }
        
        @Around("execution(* com.wangcf.manager.*.*(..))")
        public void addLogAround(JoinPoint joinPoint){
            System.out.println("添加日志记录 AfterAround start...");
            System.out.println(joinPoint.getTarget());
            System.out.println("添加日志记录 AfterAround end...");
        }
    }

    6.测试类:

    package com.wangcf.test;
    
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.wangcf.manager.IUserManager;
    import com.wangcf.po.User;
    
    
    public class TestAction {
        public static void main(String[] args) {
            BeanFactory factory=new ClassPathXmlApplicationContext("applicationContext.xml");
            IUserManager userManager=(IUserManager) factory.getBean("userManager");
            userManager.addUser();
            System.out.println("=================");
            User user=new User();
            user.setName("张三")    ;
            userManager.addUser(user);
            System.out.println("========");
            userManager.modifyUser(null);
        }
    }

    7.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"
           xsi:schemaLocation="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
        
        <bean name="userManager" class="com.wangcf.manager.UserManagerImp"/>
        <bean name="logManager" class="com.wangcf.manager.aspect.LogManager"/>
        <!--启用AspectJ的支持  -->
        <aop:aspectj-autoproxy/>
    </beans>

    8.输出

    9.总结:

    在xml配置中会生成代理类

    在使用SpringAOP的时候,业务类需要实现接口,不然就需要使用CGLIB生成目标对象的代理类

    Spring会自动选择用何种方式处理代理:

    1.JDK动态代理:当目标对象实现了接口的时候

    2.CGLIB的代理:当目标对象没有实现接口的时候

    可以强制使用CGLIB来生成代理:

    <aop:aspectj-autoproxy proxy-target-class="true"/>
  • 相关阅读:
    条款 15:在资源管理类中提供对原始资源的访问
    Python利器一之requests
    flask_入门教程之一
    Python面试题之一:解密
    珍藏版 Python 开发工程师面试试题
    Python处理Sqlite3数据库
    App自动化测试前期准备---android SDK配置
    QA 、 QC & QM软件测试入门专业名词解释 -- 灌水走起
    Nodejs的那些事
    你的第一个自动化测试:Appium 自动化测试
  • 原文地址:https://www.cnblogs.com/-beauTiFul/p/6336797.html
Copyright © 2011-2022 走看看