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"/>

AOP:spring 的Annotation配置的更多相关文章

  1. 【学习】Spring 的 AOP :基于Annotation 的“零配置”方式

    转自:http://www.cnblogs.com/jbelial/archive/2012/07/20/2539123.html AOP(Aspect Orient Programming ) , ...

  2. 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置

    在前文 深入浅出学习Spring框架(一):通过Demo阐述IoC和DI的优势所在. 深入浅出学习Spring框架(三):AOP 详解 分别介绍了Spring的核心功能——IoC和AOP,光讲知识远远 ...

  3. spring集成mybatis配置多个数据源,通过aop自动切换

    spring集成mybatis,配置多个数据源并自动切换. spring-mybatis.xml如下: <?xml version="1.0" encoding=" ...

  4. 18-spring学习-利用Annotation配置AOP

    之前是通过配置完成aop操作,如果自己写的话,太麻烦了,可以使用基于annotation的配置完成. 第一步:打开AOP的annotation支持 加上一句话: <context:annotat ...

  5. Spring AOP源码分析(二):AOP的三种配置方式与内部解析实现

    AOP配置 在应用代码中,可以通过在spring的XML配置文件applicationContext.xml或者基于注解方式来配置AOP.AOP配置的核心元素为:pointcut,advisor,as ...

  6. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  7. spring框架中AOP思想与各种配置详解

    Spring中提供两种AOP支持:   1.基于代理的经典AOP   2.Aspectj注解配置AOP    首先我们先了解什么是AOP,AOP(Aspect Oriented Programming ...

  8. java 实现类似spring的可配置的AOP框架

    一.工厂类BeanFactory: 1.工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换. 2.getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符 ...

  9. Spring MVC 事务配置

    Spring MVC事务配置 要了解事务配置的所有方法,请看一下<Spring事务配置的5种方法> 本文介绍两种配置方法: 一.      XML,使用tx标签配置拦截器实现事务 一.   ...

随机推荐

  1. SQL分页过多时, 如何优化

    问题: 我们经常会使用到分页操作,这里有个问题,在偏移量非常大的时候,它会导致MySQL扫描大量不需要的行然后再抛弃掉.如: , ; 上述这条SQL语句需要查询10020条记录然后只返回最后20条.前 ...

  2. querySelectorAll 和 getElementBy 方法的区别

    作者:简生 链接:https://www.zhihu.com/question/24702250/answer/28695133 来源:知乎 1. W3C 标准 querySelectorAll 属于 ...

  3. Windows.Devices API in a C# WinForm Win32 Desktop application in Windows 10

    https://social.msdn.microsoft.com/Forums/windows/en-US/40b4f86d-b6d5-430e-a235-7fc003dec4c4/how-to-u ...

  4. sklearn的train_test_split,果然很好用啊!

    sklearn的train_test_split   train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签. 格式: X_tra ...

  5. Rails中重写Active Record字段属性

    系统重构或升级时偶尔会碰到需要重写某个字段的情况,例如: 1. 读取user的name字段时,实际返回name_new字段 class User < ActiveRecord::Base def ...

  6. 中国大学MOOC-JAVA学习(浙大翁恺)—— 温度转换

    import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto- ...

  7. Ubuntu16.04 下 python 3.6 安装以及各版本python切换(同时解决各种依赖缺失)

    有些博客给出了从源代码通过./configure.make.sudo make 会导致安装玩之后出现各种依赖缺失的问题,如_sqlite3._bz2 等问题. 当然也有很多帖子给出了从系统自带的pyt ...

  8. style.attr,currentStyle,getComputedStyle获取元素css

    老朋友object.style.attr 平常我们都是使用object.style.attr的方式来获取元素的属性, 但是这种方法具有很大的局限性——只能获取内联样式, 而下面的两种方法可以获取到元素 ...

  9. 20155230 2016-2017-2《Java程序设计》第一周学习总结

    第一周学习总结 考核方式 100分构成 翻转课堂考核12次(5*12 = 60):每次考试20-30道题目,考试成绩规格化成5分(比如总分20分就除以4) 注意:不轮什么原因,缺考没有补考机会,但有做 ...

  10. 优步uber司机申请了为什么一直没有通过审核,帐号也显示未激活

    优步uber现在是越来越火,申请注册成为优步uber司机的人数也日剧增多,申请了的车主都知道,申请后要等待审核,审核通过才可以激活帐号,快的运气好的,三五天不到一个星期就激活了,慢点的得大半个月,还有 ...