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"/>
AOP:spring 的Annotation配置的更多相关文章
- 【学习】Spring 的 AOP :基于Annotation 的“零配置”方式
转自:http://www.cnblogs.com/jbelial/archive/2012/07/20/2539123.html AOP(Aspect Orient Programming ) , ...
- 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置
在前文 深入浅出学习Spring框架(一):通过Demo阐述IoC和DI的优势所在. 深入浅出学习Spring框架(三):AOP 详解 分别介绍了Spring的核心功能——IoC和AOP,光讲知识远远 ...
- spring集成mybatis配置多个数据源,通过aop自动切换
spring集成mybatis,配置多个数据源并自动切换. spring-mybatis.xml如下: <?xml version="1.0" encoding=" ...
- 18-spring学习-利用Annotation配置AOP
之前是通过配置完成aop操作,如果自己写的话,太麻烦了,可以使用基于annotation的配置完成. 第一步:打开AOP的annotation支持 加上一句话: <context:annotat ...
- Spring AOP源码分析(二):AOP的三种配置方式与内部解析实现
AOP配置 在应用代码中,可以通过在spring的XML配置文件applicationContext.xml或者基于注解方式来配置AOP.AOP配置的核心元素为:pointcut,advisor,as ...
- JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架
1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...
- spring框架中AOP思想与各种配置详解
Spring中提供两种AOP支持: 1.基于代理的经典AOP 2.Aspectj注解配置AOP 首先我们先了解什么是AOP,AOP(Aspect Oriented Programming ...
- java 实现类似spring的可配置的AOP框架
一.工厂类BeanFactory: 1.工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换. 2.getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符 ...
- Spring MVC 事务配置
Spring MVC事务配置 要了解事务配置的所有方法,请看一下<Spring事务配置的5种方法> 本文介绍两种配置方法: 一. XML,使用tx标签配置拦截器实现事务 一. ...
随机推荐
- Ubuntu操作系统(我的是ubuntu 18.04.3 LTS)
查看是否开启了ssh服务是否安装,使用命令: sudo ps -e |grep ssh 如果安装了的是会有sshd服务的,下面的图片是没有安装ssh服务 2 先更新资源列表,使用命令: sudo ap ...
- 笔记:javascript操作iframe内的DOM元素,及调用iframe内的方法
iframe相当于一个嵌入在网页内的浏览器,它与当前网页是隔离的. 但有时我们也需要在当前网页操作iframe内的元素或操作iframe内的javascript方法. 在网页内操作DOM元素,是使用d ...
- 在全志V3/V3s和索智S3/S3L上调试32MB NorFlash
选取MX25L25635F作为调试对象,其他型号的NorFlash开发调试原理基本一致.为了使V3/V3s/S3/S3L识别32MB NorFlash并正常工作,主要针对以下三个部分进行开发和调试.下 ...
- 发现环——第八届蓝桥杯C语言B组(国赛)第四题
原创 标题:发现环 小明的实验室有N台电脑,编号1~N.原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络.在树形网络上,任意两台 电脑之间有唯一的路径相连. 不过在最近一次维护网络时,管 ...
- Git最常用的命令 总结
stage/unstage git add xxx.xx 和 git reset HEAD xxx.xx 前者将本地的修改提交到index(此操作成为stage,参考备注1),后者将已提交到inde ...
- 20155216 2016-2017-2《Java程序设计》课程总结
20155216 2016-2017-2<Java程序设计>课程总结 (按顺序)每周作业链接汇总 预备作业1:简要内容:我对师生关系的见解 预备作业2:简要内容:有关C语言学习调查以及学习 ...
- 20145234黄斐《网络对抗技术》PC平台逆向破解
Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址. ...
- How to bind a Command on a ContextMenu within a DataTemplate using MVVM
Since the Popuup control has it's separate visual tree, you cannot use find ancestor to find the Gri ...
- shell loop
#!/bin/sh date i=0 while [ $i -le 30 ] do echi $i /usr/sbin/r2/np_test_acl -f rule.txt i=$(e ...
- pytest使用笔记(三)——pytest+allure+jenkins配置使用
按照pytest使用笔记(二)把pytest+allure配置好后,现在在jenkins配置好,先实现手动构建(立个小目标) 一,安装jenkins插件 首页->系统管理->插件管理,从“ ...