1.创建Maven项目,项目名称springdemo50,如图所示

2.配置Maven,修改项目中的pom.xml文件,修改内容如下
<project xmlns="http:///POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http:///POM/4.0.0 http:///xsd/maven-4.0.0.xsd">
<modelVersion>1.0.0</modelVersion>
<groupId>shequ</groupId>
<artifactId>springdemo13</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.7</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<repositories>
<repository>
<id>codelds</id>
<url>https://code.lds.org/nexus/content/groups/main-repo</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
</dependencies>
<build/>
</project>
3.在src/main/java下创建实体Bean Customer,包名(com.mycompany.shequ.bean)如图所示

4.实体Bean Customer的内容如下
package com.mycompany.shequ.bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("customerBean")
public class Customer {
private String name;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
public String getEmail() {
return email;
}
@Value("#{('dengyunshuo@' matches '^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)" +
"*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$') ? 'dengyunshuo@':'不合法'}")
public void setEmail(String email) {
this.email = email;
}
}
5.在src/main/java下创建接口ICustomerDao,包名(com.mycompany.shequ.dao)如图所示

6.ICustomerDao的内容如下
package com.mycompany.shequ.dao;
public interface ICustomerDao {
public void showMe();
}
7.在src/main/java下创建ICustomerDao的实现类CustomerDaoImpl,包名

8.ICustomerDao的实现类CustomerDaoImpl的内容如下
package com.mycompany.shequ.dao.impl;
import com.mycompany.shequ.dao.ICustomerDao;
public class CustomerDaoImpl implements ICustomerDao {
public void showMe() {
System.out.println("I'm CustomerDaoImpl");
}
}
9.在src/main/java下创建业务Bean ICustomerService接口,包名(com.mycompany.shequ.service)如图所示

10.ICustomerService接口的内容如下
package com.mycompany.shequ.service;
public interface ICustomerService {
public void showMe();
}
11.在src/main/java下创建业务Bean ICustomerService接口的实现类CustomerServiceImpl,包名(com.mycompany.shequ.service.impl)如图所示

12.业务Bean ICustomerService接口的实现类CustomerServiceImpl的内容如下
package com.mycompany.shequ.service.impl;
import com.mycompany.shequ.dao.ICustomerDao;
import com.mycompany.shequ.service.ICustomerService;
public class CustomerServiceImpl implements ICustomerService {
private ICustomerDao customerDao;
public ICustomerDao getCustomerDao() {
return customerDao;
}
public void setCustomerDao(ICustomerDao customerDao) {
this.customerDao = customerDao;
}
public void showMe() {
customerDao.showMe();
}
}
13.在src/main/java下创建前置通知实现类MethodBefore,包名(com.mycompany.shequ.service.impl)如图所示

14.前置通知实现类MethodBefore的内容如下
package com.mycompany.shequ.service.impl;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
/**
* 方法执行前通知
* @author Administrator
*
*/
public class MethodBefore implements MethodBeforeAdvice {
public void before(Method arg0, Object[] arg1, Object arg2)
throws Throwable {
System.out.println("前置通知被执行");
}
}
15.在src/main/java下创建后置通知实现类MethodAfter,包名(com.mycompany.shequ.service.impl)如图所示

16.后置通知实现类MethodAfter的内容如下
package com.mycompany.shequ.service.impl;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
/**
* 方法执行完成后通知
* @author Administrator
*
*/
public class MethodAfter implements AfterReturningAdvice {
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
System.out.println("后置通知被执行");
}
}
17.在src/main/java下创建异常通知实现类ThrowException,包名(com.mycompany.shequ.service.impl)如图所示

18.异常通知实现类ThrowException的内容如下
package com.mycompany.shequ.service.impl;
import org.springframework.aop.ThrowsAdvice;
/**
* 抛出异常后通知
* @author Administrator
*
*/
public class ThrowException implements ThrowsAdvice {
public void afterThrowing(IllegalArgumentException e) throws Throwable{
System.out.println("异常通知被执行");
}
}
19.在src/main/java下创建环绕通知实现类AroundMethod,包名(com.mycompany.shequ.service.impl)如图所示

20.环绕通知实现类AroundMethod的内容如下
package com.mycompany.shequ.service.impl;
import java.util.Arrays;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
/**
* 环绕通知
* @author Administrator
*
*/
public class AroundMethod implements MethodInterceptor {
public Object invoke(MethodInvocation method) throws Throwable {
System.out.println("环绕通知被执行");
System.out.println("方法名称:"+method.getMethod().getName());
System.out.println("方法参数:"+Arrays.toString(method.getArguments()));
Object result = method.proceed();
return result;
}
}
21.在src/main/resource下创建核心的配置文件applicationContext.xml,如图所示

22.配置文件applicationContext.xml,如图所示
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- customer dao Bean -->
<bean id="customerDao" class="com.mycompany.shequ.dao.impl.CustomerDaoImpl"></bean>
<!-- customer 业务层 Bean -->
<bean id="customerService" class="com.mycompany.shequ.service.impl.CustomerServiceImpl">
<property name="customerDao" ref="customerDao"></property>
</bean>
<!-- 方法执行前通知 -->
<bean id="methodBeforeBean" class="com.mycompany.shequ.service.impl.MethodBefore"></bean>
<!-- 方法执行完成后通知 -->
<bean id="methodAfterBean" class="com.mycompany.shequ.service.impl.MethodAfter"></bean>
<!-- 抛出异常后通知 -->
<bean id="throwExceptionBean" class="com.mycompany.shequ.service.impl.ThrowException"></bean>
<!-- 环绕通知 -->
<bean id="aroundMethodBean" class="com.mycompany.shequ.service.impl.AroundMethod"></bean>
<bean id="customerServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="customerService"></property>
<property name="interceptorNames">
<list>
<!-- methodBeforeBean是前置通知Bean的名称 -->
<value>methodBeforeBean</value>
<!-- methodAfterBean是后置通知Bean的名称 -->
<value>methodAfterBean</value>
<!-- throwExceptionBean是异常通知Bean的名称 -->
<value>throwExceptionBean</value>
<!-- aroundMethodBean是环绕通知Bean的名称 -->
<value>aroundMethodBean</value>
</list>
</property>
</bean>
</beans>
23.在src/test/java下创建测试文件AppTest,包名(com.mycompany.shequ.test)如图所示

24.测试文件AppTest的内容如下
package com.mycompany.shequ.test;
import org.junit.Test;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mycompany.shequ.service.ICustomerService;
public class AppTest {
@Test
public void beanTest(){
ConfigurableApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
ICustomerService customerService = (ICustomerService)
context.getBean("customerServiceProxy");
customerService.showMe();
}
}
25.在测试类AppTest的beanTest方法上右键运行,输出结果如图所示

