spring aop之xml配置
阿新 • • 發佈:2018-12-28
背景:記錄aop的使用方式。aop相關術語概念自行了解清楚,以下僅貼示例。
spring 版本:5.0.8.RELEASE
相關jar包,參考一下附件pom.xml
DAO
bean
package com.spring.aop.dao.bean; public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
dao
package com.spring.aop.dao.dao;
import com.spring.aop.dao.bean.User;
public interface UserDao {
void add(User user);
User queryByName(String name);
}
daoimpl
package com.spring.aop.dao.impl; import com.spring.aop.dao.bean.User; import com.spring.aop.dao.dao.UserDao; public class UserDaoImpl implements UserDao { public void add(User user) { System.out.println("新增使用者,姓名:" + user.getName() + ",年齡:" + user.getAge()); } public User queryByName(String name) { System.out.println("DAO查詢:"+name); if("test".equals(name)) { User user=new User(); user.setName("test"); user.setAge(18); return user; }else{ return null; } } }
Service
package com.spring.aop.service; import com.spring.aop.dao.bean.User; import com.spring.aop.dao.dao.UserDao; public class UserService { private UserDao userDao; public void setUserService(UserDao userDao){ this.userDao = userDao; } public void addUser(User user) { userDao.add(user); } public User queryByName(String name){ return userDao.queryByName(name); } }
controller
package com.spring.aop.controller;
import com.spring.aop.dao.bean.User;
import com.spring.aop.service.UserService;
public class UserController {
private UserService userService;
public UserController(UserService userService){
this.userService = userService;
}
public void addUser(User user) {
userService.addUser(user);
}
public User queryByName(String name) {
return userService.queryByName(name);
}
}
通知advice
package com.spring.aop.advice;
import com.spring.aop.dao.bean.User;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* 切面的工作 - 通知
*/
public class TestAdvice {
public void before(){
System.out.println("方法執行前執行...");
}
//呼叫方法後的返回值 - 在方法切之後執行
public void returning(Object object){
System.out.println("###方法返回之後的處理###" + (object==null ? "無資料" : object));
if (object instanceof User){
User user = (User) object;
user.setName("你的名字被修改了!");
System.out.println("#方法返回之後,處理完成");
}
}
public void after(){
System.out.println("方法執行之後執行...");
System.out.println();
}
//環繞,在before和after之間執行
public Object round(ProceedingJoinPoint point) throws Throwable {
System.out.println("******before方法之前******");
Object o = point.proceed();//呼叫對應方法
System.out.println("******after方法之後******");
return o;
}
public void throwing(Exception e) {
System.out.println("方法出現異常時執行:"+e.getMessage());
}
}
test main
package com.spring.aop.main;
import com.spring.aop.controller.UserController;
import com.spring.aop.dao.bean.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("springaop.xml");
UserController userController =context.getBean("userController", UserController.class);
// UserDao userDao =context.getBean("userDaoImpl", UserDaoImpl.class);
User user=new User();
user.setAge(22);
user.setName("AOP Test");
userController.addUser(user);
userController.queryByName("test");
}
}
aop 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"
default-autowire="byName"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--設定byName的方式注入 - default-autowire="byName"-->
<!-- 設定bean,生成的bean交由spring容器保管,並分別使用構造器和set屬性注入的方式注入 -->
<bean id="user" class="com.spring.aop.dao.bean.User">
<property name="age" value="18"/>
<property name="name" value="test"/>
</bean>
<bean id="userDaoImpl" class="com.spring.aop.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.spring.aop.service.UserService">
<property name="userService" ref="userDaoImpl"/>
</bean>
<bean id="userController" class="com.spring.aop.controller.UserController">
<constructor-arg ref="userService"/>
</bean>
<!-- AOP相關設定 -->
<bean id="advice" class="com.spring.aop.advice.TestAdvice"/>
<aop:config proxy-target-class="true">
<!--設定切點 - 在execution中進行相關設定-->
<aop:pointcut expression="execution(public * com.spring.aop.dao.impl.UserDaoImpl.*(..))" id="udi"/>
<!-- 切面 -->
<aop:aspect ref="advice">
<aop:before method="before" pointcut-ref="udi"/>
<aop:after method="after" pointcut-ref="udi"/>
<aop:after-returning method="returning" returning="object" pointcut-ref="udi"/>
<aop:after-throwing method="throwing" pointcut-ref="udi" throwing="e"/>
<aop:around method="round" pointcut-ref="udi"/>
</aop:aspect>
</aop:config>
</beans>
注意:相關aop的屬性方法介紹可參考spring-aop.xsd檔案。
附件pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.example</groupId>
<artifactId>spring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<scope>system</scope>
<systemPath>${project.basedir}/lib/aopalliance-1.0.jar</systemPath>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<scope>system</scope>
<systemPath>${project.basedir}/lib/aspectjweaver.jar</systemPath>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>