spring-aop-anno,spring,aop的注解方式
2020-01-15 11:53
148 查看
本文采用全注解方式进行spring的配置。
基于maven项目的pom.xml配置文件
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.1.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.1.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> </dependencies>
bean
Employee.java
package com.bean; public class Employee { }
dao
EmployeeDao.java
package com.dao; import com.bean.Employee; public interface EmployeeDao { public void save(Employee employee); public void update(Employee employee); }
dao实现类:
EmployeeDaoImpl.java
package com.dao; import org.springframework.stereotype.Repository; import com.bean.Employee; @Repository("employeeDao")//用注解方式,需加此注解 public class EmployeeDaoImpl implements EmployeeDao { @Override public void save(Employee employee) { System.out.println("保存员工"); } @Override public void update(Employee employee) { System.out.println("修改员工"); } }
service
EmployeeService.java
package com.service; import com.bean.Employee; public interface EmployeeService { public void save(Employee emp); public void update(Employee emp); }
service实现类:
EmployeeServiceImpl.java
package com.service.impl; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.bean.Employee; import com.dao.EmployeeDao; import com.service.EmployeeService; @Service("employeeService")//此注解也为必须 public class EmployeeServiceImpl implements EmployeeService { @Resource(name="employeeDao") private EmployeeDao dao; @Override public void save(Employee emp) { dao.save(emp); } @Override public void update(Employee emp) { dao.update(emp); throw new RuntimeException("出错了。"); } }
动态代理:
TransactionManager.java
package com.proxy; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; // 模拟事务管理器 // <bean id="aspect" class="com.proxy.TransactionManager" /> @Component // 加了此注解后,就相当于在Spring中配置了一个bean对象 @Aspect // 表示TransactionManager类是一个切面类 public class TransactionManager { // 配置连接点 // <aop:pointcut expression="execution(* com.hpeu.service..*.*(..))" id="pt"/> @Pointcut("execution(* com.service..*.*(..))") public void pt() { } //@Before("pt()") // 前置增强 //@Before("execution(* com.service..*.*(..))") public void begin() { System.out.println("开启事务"); } //@AfterReturning("pt()") // 后置增强 //@AfterReturning("execution(* com.service..*.*(..))") public void commit() { System.out.println("提交事务"); } //@After("pt()") // 最终增强 public void close() { System.out.println("释放资源"); } //@AfterThrowing(value="pt()", throwing="ex") // 异常增强 public void rollback(Throwable ex) { System.out.println("回滚事务," + ex.getMessage()); } // 环绕增强方法 @Around("pt()") public Object around(ProceedingJoinPoint pjp) { Object proceed = null; begin(); try { /* System.out.println("代理对象:" + pjp.getThis().getClass()); System.out.println("目标对象:" + pjp.getTarget().getClass()); System.out.println("被增强方法参数:" + Arrays.toString(pjp.getArgs())); System.out.println("当前连接点签名:" + pjp.getSignature()); System.out.println("当前连接点类型:" + pjp.getKind()); */ // 核心方法 proceed = pjp.proceed(); commit(); } catch (Throwable e) { rollback(e); } finally { close(); } return proceed; } }
spring配置类:
beans.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="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- DI注解解析器 --> <context:annotation-config /> <!-- IoC注解解析器 --> <context:component-scan base-package="com" /> <!-- AOP注解解析器 --> <aop:aspectj-autoproxy /> </beans>
测试类:
AOPTest.java
package com.test.dyni.proxy; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; import com.bean.Employee; import com.service.EmployeeService; @RunWith(SpringRunner.class) @ContextConfiguration("classpath:beans.xml") public class AOPTest { @Autowired private EmployeeService service; @Test public void testSave() { service.save(new Employee()); } @Test public void testUpdate() { service.update(new Employee()); } }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 使用Spring的注解方式实现AOP
- Spring AOP基础 注解方式
- SpringAOP注解方式监控方法执行情况
- 面向切面编程:SpringAOP--注解的方式
- 使用Spring的注解方式实现AOP
- 第五章 Spring进阶-注解方式实现AOP(2)
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- 使用Spring的注解方式实现AOP入门
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- 05 Spring Aop实例(AOP 如此简单)@Aspect、@Around 注解方式配置
- Spring AOP注解的方式校验参数
- Spring AOP之AspectJ的注解方式使用
- Spring中的AOP注解方式和XML方式
- spring学习笔记7--使用spring进行面向切面的(AOP)编程(1)注解方式实现
- Spring4-AOP切面-注解方式
- 使用Spring的注解方式实现AOP
- Intellij IDEA创建Spring项目之基于Aspectj的AOP操作(注解方式)
- Spring AOP 注解方式实现的一些“坑”
- 第五章 Spring进阶-注解方式实现AOP(3)-全文完