使用注解方式实现 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 ...
随机推荐
- 汉字转拼音js工具:
/ JavaScript Document var PinYin = { "a": "\u554a\u963f\u9515", "ai": ...
- Zuul【限流】
在项目中,大部分都会使用到hyrtrix做熔断机制,通过某个预定的阈值来对异常流量进行降级处理,除了做服务降级以外,还可以对服务进行限流,分流,排队等. 当然,zuul也能做到限流策略,最简单的方式就 ...
- wc 指令
统计文件的行数, 字符数, 字节数. wc 命令的功能相对简单,参数也较少,但是是统计文本行数,字符数的利器.具体的参数和用法如下 语法 wc [OPTION]... [FILE]... wc [OP ...
- QT-入门:创建项目时遇到工程工具集(Kit)找不到问题
创建项目遇到了以下提示: Please add a kit in the options or via the maintenance tool of the SDK 解决方法: 在指定的工具链中设置 ...
- shell 学习笔记3-shell变量扩展
一.特殊位置参数变量 1.特殊位置参数变量 在shell中比如:$0.$1.$#,等被称为特殊位置参数变量,当命令行.函数.脚本执行等处传递参数时,就需要使用位置参数变量 参数说明如下: 2.示例$1 ...
- [转]Entity Framework 异常: 'OFFSET' 附近有语法错误。\r\n在 FETCH 语句中选项 NEXT 的用法无效
https://blog.csdn.net/weixin_34321977/article/details/85850064 在使用 EF 的时候,突然发现更新后在服务器中运行出错,异常信息主要包含以 ...
- threejs CameraHelper 查看照相机的观察范围
简单例子 这个例子,是在一个视图中,看到照相机的辅助线,也就是,一个照相机的观察访问 这样,就需要两个照相机,一个是主照相机,一个是加有辅助线的照相机(有两种,正交和透视,这里辅助的使用的是正交的) ...
- HTML5页面介绍
1.<!DOCTYPE html> 文档声明:用于告诉浏览器使用html哪个版本的标准解析页面,此写法代表使用html5的标准去解析 2.<html> 根标签, ...
- JS实现倒计时效果,并退出系统
背景:由于单点登录后,一直在本系统操作,可是门户体统的会话失效时间有30分钟,所以30分钟后,需要重新登录系统才可以进行操作. 方法:想过在本系统中的每个操作都先跟门户系统进行交互,渠道refresh ...
- selenium按钮
学习使用selenium第一个坑,按钮type,submit,button driver.findElement(By.id("su")).submit() driver.find ...