Spring(二)——aop面向切面
2018-01-25 20:37
246 查看
一.Spring的bean管理(注解方式)
注解介绍
1.代码里面的一些特殊的标记.使用注解可以完成相关功能
2.注解写法@注解的名称(属性名称=属性值)
3.注解可以使用在类上面,方法上面 和 成员变量上
spring开发准备
1.导入jar包
(1)导入spring基本jar包
![](http://note.youdao.com/yws/res/2115/WEBRESOURCEd6410f11ff908402fd3e842d5407d522)
(2)导入aop包
![](http://note.youdao.com/yws/res/2118/WEBRESOURCEa581607731d52a88efba2e1fae159708)
2.创建类,创建方法
3.创建spring配置文件,引入约束
(1)beans约束
(2)ioc,注解约束
![](http://note.youdao.com/yws/res/2156/WEBRESOURCEd538fcf962794fecd0f6a244321f3ddf)
4.开启注解的扫描
<!-- 开启注释扫描 -->
<context:component-scan base-package="anno"></context:component-scan>
注解创建对象
4000
1.在创建对象的类上面使用注解实现
(1)
@Component(value="user") // <bean id ="user" class=""/>public class User {}
(2)
2.创建对象有四个注解
![](http://note.youdao.com/yws/res/2129/WEBRESOURCEae6547e4a8fbad06428f4a9c8ee6ccbd)
(1)@Component
(2)@Controller
(3)@Service
(4)@Repository
目前四个注解功能是一样的,都用来创建对象
3.创建对象单实例还是多实例
@Component(value="user" ) // <bean id ="user" class=""/>
@Scope(value ="prototype")
注解注入属性
1.创建service类,创建dao类,在service中得到dao对象
输入第一个注解@Autowired(通过类去找,和value没有关系)
@Resource(通过 name去找)
(1)创建service类,创建dao类
(2)在service里面定义dao类型属性
配置文件和注解混合使用的方式
1.创建对象使用配置文件方式
<bean id="bookservice" class="mix.BookService"></bean>
<bean id="bookdao" class="mix.BookDao"></bean>
<bean id="ordersdao" class="mix.OrdersDao.ordersDao()"></bean>
2.注入属性使用注解的方式
//得到bookdao和ordersdao
@Resource(name="ordersdao")
private OrdersDao OrdersDao;
@Resource(name="bookdao")
private BookDao BookDao;
二、AOP
aop概念
1.AOP:面向切面编程,扩展功能不通过修改源代码实现
2.AOP采取横向抽取机制,取代了传统纵向继承机制
aop原理
![](http://note.youdao.com/yws/res/2202/WEBRESOURCE5c9536af35c13fddac4441ba2f9b4253)
![](http://note.youdao.com/yws/res/2204/WEBRESOURCE009286602238ca60896be917354fd5f0)
aop操作术语
joinpoint(连接点):类里面可以被增强的方法,这些方法就称为连接点。
Pointcut(切入点):就是实际操作中被增强的方法,就成为切入点
advice(通知/增强);实际增强的逻辑,称为增强或者通知,例如扩展日志功能,这个日志功能就成为增强。
通知分为前置通知:在方法之前执行
后置通知,在方法之后执行
异常通知,方法出现了异常执行
最终通知,在后置之后执行
环绕通知:在方法之前之后执行
aspect(切面):把增强应用到具体的方法上面,这个过程称为切面
把增强用到切入点的过程
Introduction(引介):
target(目标对象):增强方法所在类叫做目标对象
Weaving(织入):把增强应用到目标的过程
把advice 应用到target的过程
proxy(代理):一个类AOP织入增强后,就产生一个结果代理类
三、Spring的aop操作
1.spring里面进行aop操作,使用aspectj
(1)aspectj不是spring一部分,和spring一起实现spring
(2)spring 2.0后增加了aspectj的支持
2使用aspectj实现aop方式
(1)使用aspectj的xml方式
(2)使用aspectj的注解方式
(1)使用aspectj的xml方式
准备工作
导入aop相关的jar包
![](http://note.youdao.com/yws/res/2279/WEBRESOURCE854b921b7e0174f27fcc3a6e9b451c1b)
使用表达式配置切入点
1.切入点,实际增强的方法
2.配置切面,把增强用到方法上面
bean.xml文件:
(2)基于aspectj的注解方式aop
准备工作
导入aop相关的jar包
![](http://note.youdao.com/yws/res/2279/WEBRESOURCE854b921b7e0174f27fcc3a6e9b451c1b)
上面的方法,虽然可行,但是需要在bean文档中写大量文字,也不是很方便,
注解的方法会渐变很多:
1.切入点,实际增强的方法
2.常用的表达式——用于advice上面
excution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
(1)excution(* aopDemo.Book.add(..))
(2)excution(* aopDemo.Book.*(..))
(3)excution(* *.*(..))
增强方法:
需要作为增强的方法前面加上注解@Before(value=“excution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)”)
被增强方法:
完成了在增强方法中的注解后,bean文件就很简单了,如同我们进行ioc的时候一样,只需要这一行代码就可以了
这行开启aop代理,进行class对象的扫描
bean文件中:
这个时候我们在Testaop上面 通过junit运行可以看到:
![](https://img-blog.csdn.net/20180125205207507?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM3NTUwOTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这里样我们的方法 Book.add() 就通过注解方式增强了
注解介绍
1.代码里面的一些特殊的标记.使用注解可以完成相关功能
2.注解写法@注解的名称(属性名称=属性值)
3.注解可以使用在类上面,方法上面 和 成员变量上
spring开发准备
1.导入jar包
(1)导入spring基本jar包
(2)导入aop包
2.创建类,创建方法
3.创建spring配置文件,引入约束
(1)beans约束
(2)ioc,注解约束
4.开启注解的扫描
<!-- 开启注释扫描 -->
<context:component-scan base-package="anno"></context:component-scan>
注解创建对象
4000
1.在创建对象的类上面使用注解实现
(1)
@Component(value="user") // <bean id ="user" class=""/>public class User {}
(2)
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); User user=(User)context.getBean("user"); user.add();
2.创建对象有四个注解
(1)@Component
(2)@Controller
(3)@Service
(4)@Repository
目前四个注解功能是一样的,都用来创建对象
3.创建对象单实例还是多实例
@Component(value="user" ) // <bean id ="user" class=""/>
@Scope(value ="prototype")
注解注入属性
1.创建service类,创建dao类,在service中得到dao对象
输入第一个注解@Autowired(通过类去找,和value没有关系)
@Resource(通过 name去找)
(1)创建service类,创建dao类
@Service(value = "userservice") public class Userservice { @Component(value = "userdao") public class UserDao {
(2)在service里面定义dao类型属性
@Service(value = "userservice") public class Userservice { @Component(value = "userdao") public class UserDao {
配置文件和注解混合使用的方式
1.创建对象使用配置文件方式
<bean id="bookservice" class="mix.BookService"></bean>
<bean id="bookdao" class="mix.BookDao"></bean>
<bean id="ordersdao" class="mix.OrdersDao.ordersDao()"></bean>
2.注入属性使用注解的方式
//得到bookdao和ordersdao
@Resource(name="ordersdao")
private OrdersDao OrdersDao;
@Resource(name="bookdao")
private BookDao BookDao;
二、AOP
aop概念
1.AOP:面向切面编程,扩展功能不通过修改源代码实现
2.AOP采取横向抽取机制,取代了传统纵向继承机制
aop原理
aop操作术语
joinpoint(连接点):类里面可以被增强的方法,这些方法就称为连接点。
Pointcut(切入点):就是实际操作中被增强的方法,就成为切入点
advice(通知/增强);实际增强的逻辑,称为增强或者通知,例如扩展日志功能,这个日志功能就成为增强。
通知分为前置通知:在方法之前执行
后置通知,在方法之后执行
异常通知,方法出现了异常执行
最终通知,在后置之后执行
环绕通知:在方法之前之后执行
aspect(切面):把增强应用到具体的方法上面,这个过程称为切面
把增强用到切入点的过程
Introduction(引介):
target(目标对象):增强方法所在类叫做目标对象
Weaving(织入):把增强应用到目标的过程
把advice 应用到target的过程
proxy(代理):一个类AOP织入增强后,就产生一个结果代理类
三、Spring的aop操作
1.spring里面进行aop操作,使用aspectj
(1)aspectj不是spring一部分,和spring一起实现spring
(2)spring 2.0后增加了aspectj的支持
2使用aspectj实现aop方式
(1)使用aspectj的xml方式
(2)使用aspectj的注解方式
(1)使用aspectj的xml方式
准备工作
导入aop相关的jar包
使用表达式配置切入点
1.切入点,实际增强的方法
2.配置切面,把增强用到方法上面
bean.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" xmlns:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 1.配置两个对象 --> <bean id="book" class="aopDemo.Book"></bean> <bean id="bookaddition" class="aopDemo.BookAddition"></bean> <!-- 2.配置aop操作 --> <aop:config> <!-- 2.1配置切入点 --> <aop:pointcut expression="execution(* aopDemo.Book.*(..))" id="pointcut1"/> <!-- 2.2配置切面 把增强用到方法上面 --> <aop:aspect ref="bookaddition"> <!-- 增强类型 method:增强类里面使用哪个方法作为前置增强 --> <aop:before method="before1" pointcut-ref="pointcut1"/> <!-- 后置通知 --> <aop:after method="after1" pointcut-ref="pointcut1"/> <!-- 环绕通知 --> <aop:around method="arround1" pointcut-ref="pointcut1"/> </aop:aspect> </aop:config> </beans>
(2)基于aspectj的注解方式aop
准备工作
导入aop相关的jar包
上面的方法,虽然可行,但是需要在bean文档中写大量文字,也不是很方便,
注解的方法会渐变很多:
1.切入点,实际增强的方法
2.常用的表达式——用于advice上面
excution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
(1)excution(* aopDemo.Book.add(..))
(2)excution(* aopDemo.Book.*(..))
(3)excution(* *.*(..))
增强方法:
需要作为增强的方法前面加上注解@Before(value=“excution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)”)
package aopDemo2; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class BookAddition { @Before(value="execution(* aopDemo2.Book.*(..))") public void before1(){ System.out.println("before.."); } //后置增强 @After(value="execution(* aopDemo2.Book.*(..))") public void after1(){ System.out.println("after.."); } //环绕通知 @Around(value="execution(* aopDemo2.Book.*(..))") public void arround1(ProceedingJoinPoint proceedingJoinPoint ) throws Throwable{ //前置方法 System.out.println("方法之前环绕。。。"); //执行被增强的方法 proceedingJoinPoint.proceed(); //后置方法 System.out.println("方法之环绕。。。"); } }
被增强方法:
package aopDemo2; public class Book { public void add(){ System.out.println("book.."); } }测试方法(主方法):
package aopDemo2; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Testaop { @Test public void testService(){ ApplicationContext context = new ClassPathXmlApplicationContext("aopDemo2/beans.xml"); Book book = (Book) context.getBean("book"); System.out.println(book); book.add(); } }
完成了在增强方法中的注解后,bean文件就很简单了,如同我们进行ioc的时候一样,只需要这一行代码就可以了
这行开启aop代理,进行class对象的扫描
bean文件中:
<!-- 1.配置两个对象 --> <bean id="book" class="aopDemo.Book"></bean> <bean id="bookaddition" class="aopDemo.BookAddition"></bean> <!-- 2.开启aop代理 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
这个时候我们在Testaop上面 通过junit运行可以看到:
这里样我们的方法 Book.add() 就通过注解方式增强了
相关文章推荐
- 使用Spring进行面向切面(AOP)编程
- Spring概念学习--面向切面AOP
- Spring的面向切面AOP
- Spring之面向切面编程AOP(二)
- spring的依赖注入(DI)、控制反转(IOC)和面向切面(AOP)
- Spring学习笔记(三)--面向切面编程AoP
- springAOP面向切面编程之日志记录功能
- SpringAOP的概念(面向切面)
- Spring AOP面向切面编程
- Spring(十一)使用Spring的注解方式实现面向切面技术AOP
- Spring面向切面之AOP深入探讨
- Spring--AOP--面向切面编程
- SpringAOP面向切面详解(带实例)
- 深入理解面向切面的编程AOP、AspectJ、Spring
- Spring Boot - AOP(面向切面)
- Spring笔记——使用Spring进行面向切面(AOP)编程
- Spring3.0 学习-AOP面向切面编程_Spring AOP的XML配置模式
- Spring AOP面向切面编程一个简单例子和在配置过程中出现错误
- Spring学习总结之面向切面(AOP)
- Spring面向切面(AOP)的例子