您的位置:首页 > 编程语言 > Java开发

Spring AOP基于xml配置实例

2018-01-23 20:37 507 查看


Spring AOP基于xml配置实例

SpringAOP里的几个术语,什么切面,切点之类的,官方的说明太抽象。为了更好地理解记忆,这里几下我自己的通俗的理解。

切面:就是日记类,什么前置通知后置通知(这些都是所谓的Advice)的具体方法都是写在这个日记类里的,所以把这些抽象出来的日记类就是一个切面(横切关注点)。

切点:就是某个具体的业务逻辑类,比如xxxService,也就是具体的DAO,Service之类的。

目录层级:



AOP相关的几个类就是com.aop.xmltype这个报下的4个类。

ICalculatorxml.java

?
  

CalculatorImplxml.java

?
  

MyAspectxml.java

?
  

MyAOPTest.java

?
  

执行结果:



AOP相关部分的配置,完整的xml配置在最后。

bean.xml



1 <!-- 切点的bean -->
2     <bean class="com.aop.xmltype.CalculatorImplxml" id="calImplxml"></bean>
3     <!-- 切面的bean -->
4     <bean class="com.aop.xmltype.MyAspectxml" id="myaspxml"></bean>
5     <!-- aop xmlType,用xml的形式配置AOP前置通知 -->
6     <aop:config>
7         <!--aop:pointcut 其实放在这儿也可以 -->
8         <!-- <aop:pointcut expression="execution (* com.aop.xmltype.CalculatorImplxml.*(..))"
9             id="pointcut1" /> -->
10
11         <!-- 配置切面和通知 ,aop:aspect标签需要通过ref指定配置好的bean,id随便配置或者不配置,id的值可以随意起 -->
12         <aop:aspect id="myaspxml" ref="myaspxml" order="2">
13             <!-- 配置切点,即 要被记日记的对象, aop:pointcut 放在这儿也可以 ,切点不需要根对应的bean相关联,
14              只要expression指定的方法所在的类被Spring扫描得到就行,即只要所在的类配置了bean就可以 -->
15             <aop:pointcut expression="execution (* com.aop.xmltype.CalculatorImplxml.*(..))"
16                 id="pointcut1" />
17             <!-- 切面里的具体的用于记录的方法就是一个通知,需要用通过pointcut-ref来指定具体的切点, -->
18             <aop:before method="logBefore" pointcut-ref="pointcut1" />
19             <aop:after method="logAfter" pointcut-ref="pointcut1" />
20
21         </aop:aspect>
22
23     </aop:config>






完整的beans.xml的配置如:



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:context="http://www.springframework.org/schema/context"
4     xmlns:aop="http://www.springframework.org/schema/aop"
5
6     xsi:schemaLocation="
7     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
8     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
9         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
10     <bean id="moocAppctx" class="imooc_spring.test.aware.MoocApplicationContext"
11         init-method="hhhh">
12     </bean>
13
14     <!-- 引入db.properties -->
15     <context:property-placeholder location="classpath:db.properties" />
16
17     <!-- 配置C3P0数据源 -->
18     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
19         <property name="jdbcUrl" value="${jdbc.url}"></property>
20         <property name="driverClass" value="${jdbc.driverName}"></property>
21         <property name="user" value="${jdbc.username}"></property>
22         <property name="password" value="${jdbc.pwd}"></property>
23     </bean>
24
25     <!-- 配置 Spring 的 org.springframework.jdbc.core.JdbcTemplate -->
26     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
27         <property name="dataSource" ref="dataSource"></property>
28     </bean>
29
30     <bean id="moocBeanNameAware" class="imooc_spring.test.aware.MoocBeanNameAware"></bean>
31
32     <!-- 测试 SpEL: 可以为属性进行动态的赋值(了解) -->
33     <bean id="girl" class="com.helloworld.User">
34         <property name="userName" value="周迅"></property>
35     </bean>
36
37     <!-- <bean id="boy" class="com.helloworld.User" init-method="init" destroy-method="destroy">
38         <property name="userName" value="高胜远"></property> <property name="wifeName"
39         value="#{girl.userName}"></property> </bean> -->
40
41     <bean id="girl2" class="com.helloworld.User2">
42         <property name="userName" value="Talor Swift"></property>
43     </bean>
44
45     <!-- autowired测试,自动装配测试 -->
46     <bean id="people" class="test.spring.autowired.Person" scope="prototype"
47         autowire="byName">
48         <property name="name" value="小明"></property>
49         <!-- <property name="cat" ref="cat222"></property> -->
50         <!-- <property name="cat" ref="cat1"></property> -->
51     </bean>
52
53     <bean id="cat" class="test.spring.autowired.Cat" scope="prototype">
54         <property name="name" value="波斯猫"></property>
55     </bean>
56     <!-- <bean id="cat222" class="test.spring.autowired.Cat"> <property name="name"
57         value="我是小喵喵"></property> </bean> -->
58
59
60
61     <bean id="people2" class="test.spring.autowired.Person" scope="prototype"
62         autowire="byName">
63         <property name="name" value="小明"></property>
64         <property name="cat" ref="cat222"></property>
65     </bean>
66
67     <bean id="cat222" class="test.spring.autowired.Cat" scope="prototype">
68         <property name="name" value="波斯猫"></property>
69     </bean>
70
71     <!--context:component-scan 指定 扫描的包 -->
72     <!--可以通过 resource-pattern 指定扫描的资源, resource-pattern="myrepository/*.class"
73         的含义: 只扫描 base-package 对应包下的 目录为 myrepository 的所有java Bean -->
74     <!-- <context:component-scan base-package="imooc_spring.test.anotation"
75         resource-pattern="myrepository/*.class"></context:component-scan> -->
76
77     <!-- context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"
78         子节点指定排除哪些注解 context:include-filter type="annotation" 需要结合context:component-scan
79         标签的 use-default-filters="false"来使用 context:exclude-filter type="assignable"
80         这个expression指的是自己写的类,意思排除哪些类 expression="imooc_spring.test.anotation.TestObj" -->
81     <context:component-scan base-package="imooc_spring.test.anotation">
82         <!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"
83             /> -->
84
85         <!-- <context:exclude-filter type="assignable" expression="imooc_spring.test.anotation.TestObj"
86             /> -->
87
88
89     </context:component-scan>
90     <context:component-scan base-package="com.aop"></context:component-scan>
91
92     <!-- aop测试,需要引入aop命名空间 -->
93     <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
94
95
96
97
98     <!-- aop annotationType, -->
99
100
101
102
103
104
105
106
107
108
109
110
111     <!-- 切点的bean -->
112     <bean class="com.aop.xmltype.CalculatorImplxml" id="calImplxml"></bean>
113     <!-- 切面的bean -->
114     <bean class="com.aop.xmltype.MyAspectxml" id="myaspxml"></bean>
115     <!-- aop xmlType,用xml的形式配置AOP前置通知 -->
116     <aop:config>
117         <!--aop:pointcut 其实放在这儿也可以 -->
118         <!-- <aop:pointcut expression="execution (* com.aop.xmltype.CalculatorImplxml.*(..))"
119             id="pointcut1" /> -->
120
121         <!-- 配置切面和通知 ,aop:aspect标签需要通过ref指定配置好的bean,id随便配置或者不配置,id的值可以随意起 -->
122         <aop:aspect id="myaspxml" ref="myaspxml" order="2">
123             <!-- 配置切点,即 要被记日记的对象, aop:pointcut 放在这儿也可以 ,切点不需要根对应的bean相关联,
124              只要expression指定的方法所在的类被Spring扫描得到就行,即只要所在的类配置了bean就可以 -->
125             <aop:pointcut expression="execution (* com.aop.xmltype.CalculatorImplxml.*(..))"
126                 id="pointcut1" />
127             <!-- 切面里的具体的用于记录的方法就是一个通知,需要用通过pointcut-ref来指定具体的切点, -->
128             <aop:before method="logBefore" pointcut-ref="pointcut1" />
129             <aop:after method="logAfter" pointcut-ref="pointcut1" />
130
131         </aop:aspect>
132
133     </aop:config>
134
135
136
137
138
139
140
141 </beans>




项目名为:imooc_spring.rar,在我的qq微云上。

点我获取项目。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: