方式一:xml配置文件实现
BaseDao.java
package com.guo.dao;
public interface BaseDao {
public void insert();
public void delete();
public void update();
public void select();
}
OptLogger.java
package com.guo.dao;
public class OptLogger {
public void myBefore() {
System.out.println("before ...");
}
}
UserDao.java
package com.guo.dao;
public class UserDao implements BaseDao {
public void insert() {
System.out.println("insert()");
}
public void delete() {
System.out.println("delete()");
}
public void update() {
System.out.println("update()");
}
public void select() {
System.out.println("select()");
}
}
applicationContext.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"
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-2.5.xsd">
<bean id="userDao" class="com.guo.dao.UserDao"></bean>
<bean id="optLogger" class="com.guo.dao.OptLogger"></bean>
<aop:config>
<aop:aspect ref="optLogger">
<aop:before method="myBefore" pointcut="execution(* com.guo.dao.UserDao.*(..))" />
</aop:aspect>
</aop:config>
</beans>
UserDaoTest.java
package com.guo.test;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.guo.dao.BaseDao;
import com.guo.dao.UserDao;
public class UserDaoTest {
public ApplicationContext context;
@Before
public void init() {
context = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void test1() {
System.out.println("--------------无参构造实例化-----------------");
BaseDao userDao = context.getBean("userDao", BaseDao.class); // aop 有效
userDao.insert();
BaseDao userDao1 = (BaseDao) context.getBean("userDao");// aop 有效
userDao1.delete();
UserDao userDao2 = (UserDao) context.getBean("userDao");// aop 无效
userDao2.update();
BaseDao userDao3 = context.getBean("userDao", UserDao.class);// aop 无效
userDao3.delete();
UserDao userDao4 = context.getBean("userDao", UserDao.class);// aop 无效
userDao4.update();
System.out.println("end");
}
}
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.guo</groupId>
<artifactId>maven-spring-aop</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- junit单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.0.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- spring IOC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.0.RELEASE</version>
</dependency>
<!-- spring AOP -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.2.0.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
方式二:注解方法实现
只需修改方式一中的两个文件:
OptLogger.java
package com.guo.dao;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class OptLogger {
@Before("execution(* com.guo.dao.UserDao.*(..))")
public void myBefore() {
System.out.println("before ...");
}
}
applicationContext.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"
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-2.5.xsd">
<bean id="userDao" class="com.guo.dao.UserDao"></bean>
<bean id="optLogger" class="com.guo.dao.OptLogger"></bean>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>