夜光带你走进Spring(四)

时间:2019-04-15
本文章向大家介绍夜光带你走进Spring(四),主要包括夜光带你走进Spring(四)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

夜光序言:

哪儿有什么天长地久,只不过是一时拥有;

哪儿有什么雪月风花,只不过是沧海幻化。

 

 

正文:

2. Aop编程

public void add(User user) {

Session session = null;

Transaction trans = null;

try {

session = HibernateSessionFactoryUtils.getSession();   【关注点代码】

trans = session.beginTransaction();                   【关注点代码】

 

session.save(user);     // 业务

 

trans.commit();                                    【关注点代码】

} catch (Exception e) {

e.printStackTrace();

if(trans != null){

trans.rollback();

}

} finally{

HibernateSessionFactoryUtils.closeSession(session);

}

   }

 

 

Aop 编程,

主要是分离业务代码与关注点代码~

关注点代码,写一次,在执行业务代码时候动态植入关注点代码~

 

自己实现aop编程

 

aop编程, 注解方式

概念:

Aop编程:

关注点代码与业务代码分离~(jdk/cglib代理)

关注点:

重复执行的代码, 也叫关注点代码

切面:

关注点代码形成的类,就叫做切面

springAop编程,也叫面向切面编程~

   Aop: Aspect Object Programming 面向切面编程

 

举例,哪些是切面?

事务,权限控制, 日志…

 

切入点表达式

拦截方法,给方法所在的类,生成代理对象~

Spring在初始化容器的时候,会根据切入点表达式的规则,会符合拦截规则的方法所在的类生成代理对象~

 

 

使用Aop开发步骤:

1. 引入aop 相关 jar文件

(aspectj 在spring之前,面向切面开发的公用组件)

aopalliance.jar               【spring-framework-2.5.6\lib\aopalliance

aspectjrt.jar    【spring-framework-2.5.6\lib\aspectj

aspectjweaver.jar             【spring-framework-2.5.6\lib\aspectj

spring-aop-3.2.5.RELEASE.jar    【Spring3.2源码】

 

2. 引入aop名称空间

 

<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:component-scan base-package="cn.Genius.e_aop_anno"></context:component-scan>

<!-- 开启aop注解 -->

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

 

</beans>    

 

3. 开启aop注解

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>


4. 使用Aop相关注解

 

@Aspect      指定一个类为切面类

(切面类也需要实例化)

(切面类中的方法,也叫做通知)

@Before        前置通知  【在执行目标对象方法之前执行】

@After    后置通知  【在执行目标对象方法之后执行】

@AfterReturning    返回后通知  【在执行目标对象方法结束后执行, 出现异常不执行】

@AfterThrowing    异常通知   【在执行目标对象方法出现异常时候执行】

@Around          环绕通知   【环绕目标方法执行】

 

@Pointcut      定义一个切入点表达式变量  (后面使用这个切入点表达式的时候,直接引用方法名即可)

 

 

Spring生成代理对象的过程?

1. 创建容器对象的时候, 根据“切入点表达式”拦截的类,生成代理对象;

2. 如果目标对象有实现接口,使用jdk代理~

3. 如果目标对象没有实现接口,使用cglib代理~

4. 从容器获取代理后的对象

5. 执行代理对象的方法,在运行时期,动态植入“切面”类中的“通知”