使用注解方式实现 AOP和IoC
使用注解方式实现AOP和IoC
IOC和DI的注解
IOC:
@Component:实现Bean组件的定义
@Repository:用于标注DAO类,功能与@Component作用相当
@Service:用于标注业务类
@Controller:用于标注控制器
DI:
@Resource(name="userService")
默认ByName方式,如果name确实默认按照ByType方式注入
@Autowired
默认ByType方式,如果出现同名类,则不能按照Type进行注入
需要使用@Qualifier 指明ID
1. 使用注解实现IoC案例
1.1 编写applicationContext.xm文件
<!--扫描注解:包扫描器--> <context:component-scan base-package="cn.spring"/>
1.2创建mapper接口
public interface UserMapper { public int addUser(User user); }
1.3 创建mapper接口实现类
@Repository public class UserMapperImpl implements UserMapper { @Override public int addUser(User user) { System.out.println("添加成功"); return 1; } }
1.4创建Service接口
public interface UserService { public int addUser(User user); }
1.5创建Service接口实现类
@Service("userServiceImpl") public class UserServiceImpl implements UserService { //植入Dao层对象 //@Resource默认是根据byName的方式,但是一旦名字为空 ,就根据byType @Autowired private UserMapper userMapper; @Override public int addUser(User user) { return userMapper.addUser(user); } }
1.6 编写测试类
@org.junit.Test public void test2() { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //通过类型调度 //UserInfoService userService=context.getBean(UserService.class); //指定@Service的value值后使用bean的id名称调度 UserService userServiceImpl = (UserService) context.getBean("userServiceImpl"); userServiceImpl.addUser(new User()); }
1.7 控制台
使用注解方式实现AOP
- 实现AOP的注解有
- @Aspect 声明切面
- @Ponitcut 声明公共的切点表达式
- @Before 前置增强
- @AfterReturning 后置增强
- @Around 环绕增强
- @AfterThrowing 异常抛出增强
- @After 最终增强
1.使用注解方式实现前置增强和后置增强
1.1 编写applicationContext.xml文件
<!--开启AOP注解支持--> <aop:aspectj-autoproxy/>
1.2 创建Service类
@Service("IDoSomeService") public class IDoSomeService { public void doSome(){ System.out.println("业务类中dosome方法"); } public void say(){ System.out.println("业务类中say方法"); } }
1.3 编写切面类实现增强
@Aspect @Component public class MyAdvice { @Pointcut("execution(* *..service.*.*(..))") public void point(){ } @Before("point()") public void before(){ System.out.println("前置增强"); } @AfterReturning("execution(* *..service.*.*(..))") public void afterReturning(){ System.out.println("后置增强"); } }
1.4 编写测试类
@org.junit.Test public void test3(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); IDoSomeService iDoSomeService = (IDoSomeService)context.getBean("IDoSomeService"); iDoSomeService.doSome(); iDoSomeService.say(); }
1.5 控制台
2. 使用注解方式实现环绕增强
2.1 编写applicationContext.xml文件
<!--扫描注解:包扫描器--> <context:component-scan base-package="cn.spring"/> <!--开启AOP注解支持--> <aop:aspectj-autoproxy/>
2.2 创建Service类
@Service("IDoSomeService") public class IDoSomeService { public void doSome(){ System.out.println("业务类中dosome方法"); } public void say(){ System.out.println("业务类中say方法"); } }
2.3编写切面类实现增强
@Aspect @Component public class AroundAdvisor { @Around("execution(* *..service.*.*(..))") public void around(ProceedingJoinPoint PJ) throws Throwable { System.out.println("环绕增强"); PJ.proceed(); System.out.println("环绕增强"); } }
2.4编写测试类
@org.junit.Test public void test3(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); IDoSomeService iDoSomeService = (IDoSomeService)context.getBean("IDoSomeService"); iDoSomeService.doSome(); iDoSomeService.say(); }
2.5控制台
3. 使用注解实现异常抛出增强
在exception包下完成对应的用例。
声明切面类
@Aspect public class AroundLoggerAnno { @Around("execution(* com.cmy.service.*.*(..))") public Object aroundLogger(ProceedingJoinPoint jp) throws Throwable { System.out.println("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName() + " 方法。方法入参:" + Arrays.toString(jp.getArgs())); try { Object result = jp.proceed(); System.out.println("调用 " + jp.getTarget() + " 的 " + jp.getSignature().getName() + " 方法。方法返回值:" + result); return result; } catch (Throwable e) { System.out.println(jp.getSignature().getName() + " 方法发生异常:" + e); throw e; } finally { System.out.println(jp.getSignature().getName() + " 方法结束执行。"); } }
创建Spring的核心配置文件,开启Spring对IOC和AOP注解的支持
新增app-08.xml文件
<!--开启Spring IOC的注解支持 base-package 包扫描语句 com.cmy包下的注解--> <context:component-scan base-package="com.cmy"/> <!--配置增强类 交给Spring容器管理--> <bean class="com.cmy.exception.ErrorLogger"></bean> <!--开启Spring AOP注解的支持--> <aop:aspectj-autoproxy />
编写测试用例,在DoSomeServiceImpl模拟异常
public class Demo2 { public static void main(String[] args) { //声明式增强 必须加载Spring容器 ApplicationContext app = new ClassPathXmlApplicationContext("com/cmy/exception/app-08.xml"); //获取代理对象 DoSomeService doSomeService=(DoSomeService)app.getBean("doSomeService"); doSomeService.say(); } }
4.使用注解实现最终增强
使用After包,增加切面类
/** * 通过注解实现最终增强 */ @Aspect public class AfterLoggerAnno { @After("execution(* com.cmy.service.*.*(..))") public void afterLogger(JoinPoint jp) { System.out.println(jp.getSignature().getName() + " 方法结束执行。"); } }
新建app-10.xml文件
<!--开启Spring IOC的注解支持 base-package 包扫描语句 com.cmy包下的注解--> <context:component-scan base-package="com.cmy"></context:component-scan> <!--配置增强类 交给Spring容器管理--> <bean class="com.cmy.after.AfterLoggerAnno"></bean> <!--开启Spring AOP注解的支持--> <aop:aspectj-autoproxy />
创建测试用例
public class Demo2 { public static void main(String[] args) { //声明式增强 必须加载Spring容器 ApplicationContext app = new ClassPathXmlApplicationContext("com/cmy/after/app-10.xml"); //获取代理对象 DoSomeService doSomeService=(DoSomeService)app.getBean("doSomeService"); doSomeService.say(); } }
使用注解方式实现 AOP和IoC的更多相关文章
- (转)使用Spring的注解方式实现AOP入门
http://blog.csdn.net/yerenyuan_pku/article/details/52865330 首先在Eclipse中新建一个普通的Java Project,名称为spring ...
- 基于AspectJ的注解方式进行AOP开发
-------------------siwuxie095 基于 AspectJ 的注解方式进行 AOP 开发 ...
- (转)使用Spring的注解方式实现AOP的细节
http://blog.csdn.net/yerenyuan_pku/article/details/52879669 前面我们已经入门使用Spring的注解方式实现AOP了,现在我们再来学习使用Sp ...
- Spring系列之aAOP AOP是什么?+xml方式实现aop+注解方式实现aop
Spring系列之aop aop是什么?+xml方式实现aop+注解方式实现aop 什么是AOP? AOP为Aspect Oriented Programming 的缩写,意识为面向切面的编程,是通过 ...
- spring----IOC注解方式以及AOP
技术分析之Spring框架的IOC功能之注解的方式 Spring框架的IOC之注解方式的快速入门 1. 步骤一:导入注解开发所有需要的jar包 * 引入IOC容器必须的6个jar包 * 多引入一个:S ...
- Spring的注解方式实现AOP
Spring对AOP的实现提供了很好的支持.下面我们就使用Spring的注解来完成AOP做一个例子. 首先,为了使用Spring的AOP注解功能,必须导入如下几个包.aspectjrt.jar,asp ...
- 使用Spring的注解方式实现AOP
Spring对AOP的实现提供了很好的支持.下面我们就使用Spring的注解来完成AOP做一个例子. 首先,为了使用Spring的AOP注解功能,必须导入如下几个包.aspectjrt.jar,asp ...
- spring 纯注解方式 与AOP
spring注解方式 以前我也使用过纯注解方式.现在在这里做个记录 我们先认识几个我们都耳熟能详的注解 @configuration :从spring3.0这个注解就可以用于定义配置类,可以替换xml ...
- 注解方式实现AOP编程
步骤: 1) 先引入aop相关jar文件 (aspectj aop优秀组件) spring-aop-3.2.5.RELEASE.jar [spring3.2源码] aopal ...
随机推荐
- LeetCode 896. 单调数列(Monotonic Array)
896. 单调数列 896. Monotonic Array 题目描述 如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i<=j,A[i]<=A[j],那么数组 A 是单调 ...
- [转帖]鲁大师Q3季度PC内存排行:DDR3彻底淘汰 DDR5要来了
鲁大师Q3季度PC内存排行:DDR3彻底淘汰 DDR5要来了 https://www.cnbeta.com/articles/tech/902347.htm 10月23日消息,今天鲁大师公布Q3季度P ...
- 对比JPA 和Hibernate 和 Mybatis的区别
1.JPA.Hibernate.Mybatis简单了解 1.JPA:本身是一种ORM规范,不是ORM框架.由各大ORM框架提供实现. 2.Hibernate:目前最流行的ORM框架,设计灵巧,文档丰富 ...
- Mock常用占位符一览
1.随机字符串(类型 , 位数)@string(lower,10) lower : 小写字母upper : 大写字母number : 数字 2.随机int(下限 , 上限)@integer(60, 1 ...
- 【es6】promise
一.什么是promise?我们用promise解决什么样的问题 promise是异步编程的一种解决方案:从语法上来说,Promise是一个对象,从他可以获取异步操作的信息:从本意上讲,它是承诺,它承诺 ...
- ext TreePanel树节点操作
1.全部展开 tree.expandAll();2.全部收缩 tree.collapseAll();3.得到父节点 node.parentNode4.判断是否有父节点 node.parentNode= ...
- css 层叠 比较特殊性
css 层叠: 多个相同的css声明(属性),应用到同一个元素上.当一个标签声明冲突时,浏览器会自动出发层叠机制 1:比较优先级 2:比较特殊性 3:比较源次序 依次经过上面的1,2,3的比较后,最终 ...
- iOS开发常见的宏定义(实用)
iOS开发过程中使用一些常用的宏可以提高开发效率,提高代码的重用性:将这些宏放到一个头文件里然后再放到工程中的-Prefix.pch文件中(或者直接放到-Prefix.pch中)直接可以使用,灰常方便 ...
- Android笔记(十) Android中的布局——表格布局
TableLayout运行我们使用表格的方式来排列控件,它的本质依然是线性布局.表格布局采用行.列的形式来管理控件,TableLayout并不需要明确的声明包含多少行多少列,而是通过添加TableRo ...
- 初始化springbean
public class SMSMessageHandler implements InitializingBean { @Overridepublic void afterPropertiesSet ...