SSM-Spring-03:Spring中AOP的初窥和入门小案例

释放双眼,带上耳机,听听看~!

 


1
2
1------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
2

 

 

AOP:面向切面编程

AOP的主要作用:是为了程序员更好的关注"业务",专心"做事"

加上双引号的意思:所谓业务,是指他的核心,各行业中需要处理的核心事务,核心啊

像日志的记录,事务的管理,权限分配等这些交叉业务,同一个项目中使用多次,直接提取出来成为公共的比较好,再用面向切面的方式,进行代码的编辑,业务的实现

AOP的思想:

SSM-Spring-03:Spring中AOP的初窥和入门小案例

正如上图所示的,最基本的方式实现的业务和AOP方式实现的业务,是不同的,或许你会说,我在没有aop的时候,我也不像上面那个最low的方式一样啊,是,有比那个最low的方式好的多的是,我们要学习新的思想,aop,面向切面编程

AOP的原理

SSM-Spring-03:Spring中AOP的初窥和入门小案例

 

——————————————————————————————————————————–

入门案例:

用最基本的方式模拟一道日志的记录和最后执行完业务的操作

DAO层(一个接口,一个他的实现类,模拟操作修改数据库)

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1package cn.dawn.day04aop.dao;
2
3/**
4 * Created by Dawn on 2018/3/5.
5 */
6/*dao层接口*/
7public interface IHellowDAO {
8    /*aop入门案例*/
9    public void doSome();
10}
11
12
13package cn.dawn.day04aop.dao.impl;
14
15import cn.dawn.day04aop.dao.IHellowDAO;
16
17/**
18 * Created by Dawn on 2018/3/5.
19 */
20/*dao层实现类*/
21public class HellowDAOImpl implements IHellowDAO{
22
23    public void doSome() {
24        System.out.println("数据已经成功写入到DB");
25    }
26}
27

 

service层(也是一个接口,一个实现类,主要做的aop的增强操作,操作的是service层,业务逻辑处理层操作的)

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1package cn.dawn.day04aop.service;
2
3/**
4 * Created by Dawn on 2018/3/5.
5 */
6/*service层接口*/
7public interface IHellowService {
8    /*aop入门案例*/
9    public void doSome();
10}
11
12
13
14
15package cn.dawn.day04aop.service.impl;
16
17import cn.dawn.day04aop.dao.IHellowDAO;
18import cn.dawn.day04aop.service.IHellowService;
19
20/**
21 * Created by Dawn on 2018/3/5.
22 */
23/*service层实现类 */
24public class HellowServiceImpl implements IHellowService {
25    IHellowDAO dao;
26    public void doSome() {
27        dao.doSome();
28    }
29
30    public IHellowDAO getDao() {
31        return dao;
32    }
33
34    public void setDao(IHellowDAO dao) {
35        this.dao = dao;
36    }
37}
38

 

新开多的一层,叫aop层,他就存放了增强的操作(也就是交叉业务,例如日志记录等),此处我放了俩个类,一个执行前置增强,一个后置增强

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
1package cn.dawn.day04aop.aop;
2
3
4import org.springframework.aop.MethodBeforeAdvice;
5
6import java.lang.reflect.Method;
7
8/**
9 * Created by Dawn on 2018/3/5.
10 */
11/*前置增强*/
12public class LoggerBefore implements MethodBeforeAdvice {
13    public void before(Method method, Object[] objects, Object o) throws Throwable {
14        System.out.println("日志记录");
15    }
16}
17
18
19
20
21
22
23
24package cn.dawn.day04aop.aop;
25
26import org.springframework.aop.AfterReturningAdvice;
27
28import java.lang.reflect.Method;
29
30/**
31 * Created by Dawn on 2018/3/5.
32 */
33/*后置增强*/
34public class LoggerAfter implements AfterReturningAdvice {
35    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
36        System.out.println("===============after==================");
37    }
38}
39

 

前置增强,需要实现MethodBeforeAdvice,后置增强,需要实现AfterReturningAdvice

 

接下来就是书写大配置xml文件

 有个注意的点,由于我用的idea,他会自动生成上面的beans的 xmlns和xsi,如果你不是用idea的话,手动配置一道吧

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1<?xml version="1.0" encoding="UTF-8"?>
2<beans xmlns="http://www.springframework.org/schema/beans"
3       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
4       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
5
6    <!--aop入门案例起-->
7    <!--dao-->
8    <bean id="dao" class="cn.dawn.day04aop.dao.impl.HellowDAOImpl"></bean>
9    <!--service-->
10    <bean id="service" class="cn.dawn.day04aop.service.impl.HellowServiceImpl">
11        <property name="dao" ref="dao"></property>
12    </bean>
13    <!--通知-->
14    <bean id="afterAdvice" class="cn.dawn.day04aop.aop.LoggerAfter"></bean>
15    <bean id="beforeAdvice" class="cn.dawn.day04aop.aop.LoggerBefore"></bean>
16    <!--aop-->
17    <aop:config>
18        <!--切点-->
19        <aop:pointcut id="mypointcut" expression="execution(* *..service.*.*(..))"></aop:pointcut>
20        <!--<aop:pointcut id="mypointcut" expression="execution(public void cn.dawn.day04aop.service.IHellowService.doSome())"></aop:pointcut>-->
21        <!--<aop:pointcut id="mypointcut" expression="execution(* *..service.*.*(..))">-->
22        <!--顾问,织入-->
23        <aop:advisor advice-ref="beforeAdvice" pointcut-ref="mypointcut"></aop:advisor>
24        <aop:advisor advice-ref="afterAdvice" pointcut-ref="mypointcut"></aop:advisor>
25    </aop:config>
26    <!--aop入门案例完毕-->
27</beans>
28

 

这儿有一个切点pointcut,我说一下他的expression的属性吧,他就是里面放一个匹配的(可以说叫公式?)方法的公式

他的使用规则我放在下面

**SSM-Spring-03:Spring中AOP的初窥和入门小案例        **

接下来单测方法

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1package cn.dawn.day04aop;
2
3import cn.dawn.day03printer.printer.Printer;
4import cn.dawn.day04aop.service.IHellowService;
5import org.junit.Test;
6import org.springframework.context.ApplicationContext;
7import org.springframework.context.support.ClassPathXmlApplicationContext;
8
9/**
10 * Created by Dawn on 2018/3/3.
11 */
12public class test20180305 {
13    @Test
14    /*aop入门案例*/
15    public void t01(){
16        ApplicationContext context=new ClassPathXmlApplicationContext("ApplicationContext-day04aop.xml");
17        IHellowService service = (IHellowService) context.getBean("service");
18        service.doSome();
19    }
20}
21

 

运行结果如下:

SSM-Spring-03:Spring中AOP的初窥和入门小案例

 

给TA打赏
共{{data.count}}人
人已打赏
安全技术

C/C++内存泄漏及检测

2022-1-11 12:36:11

安全技术

GOlang服务器使用CapnProto, Protobuf, RapidJson, SBE, FlatterBuff协议调研比较以及最后选择

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索