spring学习3_通过注解简单实现AOP

在上一篇中通过XML配置演示了Spring实际进行AOP的过程,这里简单介绍一下通过注解实现这一功能的过程。

1、Spring配置

<?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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

  <context:annotation-config/>
  <context:component-scan base-package="com"></context:component-scan>
  <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

其中<context:annotation-config/> 声明将启用Spring自带的BeanPosProcess对添加注解的类进行处理。

<context:component-scan base-package="com"></context:component-scan> 将对com包下的所有类进行初始化。

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>声明为注解为@Apect的切面类生成Proxy代理类。

2、拦截器类

package com.handler;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogInterceptor {
    @Before("execution(* com.service..*.*(..))")
    public void beforeExcute(){
        System.out.println("aspect execute.");
    }

}

@Component 注解为该类在容器中进行初始化。

@Aspect注解声明该类作为切面类,由Spring自动为其生成代理类。

另外,在方法上声明@before,其表示在executions中对应的方法前面执行。类似的用法还有@After、@Around等。

3、Service方法中注入Dao层

package com.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.dao.UserDao;

@Component("userService")
public class UserService {

    private UserDao dao;

    @Autowired
    public void setDao(UserDao dao) {
        this.dao = dao;
    }

    public void save(){
        dao.save();
    }

}

@AutoWired自动按类型进行注入

测试:

package com.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.service.UserService;

public class TestAopAnnotation {
    @Test
    public void testAopAnnotation(){

        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

        UserService service = (UserService) context.getBean("userService");
        System.out.println(service.getClass());
        service.save();

    }
}

执行结果  

将类打印出来后可以看出,此时从容器中取出的类为由Spring生成的代理类。

时间: 2024-10-11 00:07:06

spring学习3_通过注解简单实现AOP的相关文章

spring学习2:基于注解+xml实现ioc和依赖注入

spring学习2:基于注解+xml实现ioc和依赖注入 一.在spring配置文件中开启spring对注解的支持 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&qu

Spring学习之事务注解@Transactional

今天学习spring中的事务注解,在学习Spring注解事务之前需要明白一些事务的基本概念: 事务:并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务数据库能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性. 事务隔离级别:在并发处理数据中,为了保持数据的完整性和正确性,而执行的操作数据方式. 脏读 :一个事务读取到另一事务未提交的更新数据. 幻读:一个事务读到另一个事务已提交的insert数据. 不可重复读: 是指在一个事务内多

Spring学习--用 ASpectJ 注解实现 AOP

用 AspectJ 注解声明切面: 要在 Spring 中声明 AspectJ 切面 , 只需要在 IOC 容器中将切面声明为 bean 实例.当在 Spring IOC 容器中初始化 AsjectJ 切面之后 , Spring IOC 容器就会为那些与 AspectJ 切面相匹配的 bean 创建代理. 在 ApectJ 注解中 , 切面只是一个带有 @Asject 注解的 Java 类. 通知是标注有某种注解的简单的 Java 方法. AspectJ 支持 5 种类型的通知注解: @Befo

Spring第二天——IOC注解操作与AOP概念

大致内容 spring的bean管理(注解实现) AOP原理 log4j介绍 spring整合web项目的演示 一.spring注解实现bean管理 注解: 代码中一些特殊的标记,使用注解也可以完成一些相关的功能(写法"@") 方法上.类上(详见基础加强) 使用注解创建对象,注入属性(完成day01相似的功能) 可以使用注解,但不可能完全替代xml配置文件 准备工作: 导入包:除了day01的6个核心jar包(当然包括日志的包) 再加上aop的那个jar包(注解功能在里面),也就是图中

Spring学习笔记--使用注解装配

使用@Autowired注解 从Spring2.5开始,最有趣的一种装配Spring Bean的方式是使用注解自动装配Bean的属性.Spring默认禁用注解装配,最简单的启用方式是使用Spring的context命名空间配置中的<context:annotation-config>元素,如下所示: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.

Spring学习总结之面向切面(AOP)

AOP术语 通知(advice):定义切面是什么以及什么时候使用 连接点(join point):应用在执行过程中能够插入切面的点 切点(pointcut):切点的定义会匹配通知所要织入的一个或多个连接点 切面(aspect):通知和切点的结合 引入(introduction):允许我们向现有的类添加新方法或属性 织入(weaving):把切面应用到目标对象并创建新的代理对象的过程 Spring使用AspectJ注解来声明通知方法 @After:通知方法会在目标方法返回或抛出异常后调用 @Aft

spring学习(五)详细介绍AOP

AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待 它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面.所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性. 举个例子: Spring对AOP的支持 Spr

spring学习笔记之——注解

spring注解可以很大的减少xml的配置,spring.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:context

Spring学习之常用注解(转)

使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>. 如:在base-package指明一个包 1 <context:component-scan base-package="cn.gacl.java"/> 表明cn.gacl.java包及其子包中,如