AOP面向切面编程(Aspect Oriented Programming),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
AOP需要在beans.xml中单独配置,包括<beans/>中的aop路径和config配置标签
1、通过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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<!-- aop配置文件 -->
<aop:config>
<!-- 定义切面 -->
<aop:aspect id="log" ref="logBean">
<!-- 定义连接点,扫描 com.spring.Aop.demo 下所有类的所有函数 并声明id-->
<aop:pointcut expression="execution(* com.spring.Aop.demoXML.*.*(..))" id="point" />
<!-- 调用之前执行函数 before-->
<aop:before method="before" pointcut-ref="point"/>
<!-- 之后 -->
<aop:after method="after" pointcut-ref="point"/>
<!--
在目标方法完成之后,增强处理(会限制目标返回值)
returning="retVal"表明允许在方法afterReturning()中定义名为result的形参
-->
<aop:after-returning method="afterReturning" pointcut-ref="point" returning="result"/>
</aop:aspect>
</aop:config>
<bean id="user" class="com.spring.Aop.demoXML.User">
<property name="username" value="admin"/>
<property name="password" value="123456"/>
</bean>
<bean id="logBean" class="com.spring.Aop.demoXML.Log"></bean>
</beans>
切面处理类
package com.spring.Aop.demoXML;
public class Log {
public void before(){
System.out.println("before之前");
}
public void after(){
System.out.println("after之后");
}
public void afterReturning(Object result){
System.out.println("afterReturning:"+result);
}
public void afterThrowing(Exception exception){
System.out.println("afterThrowing:"+exception.toString());
}
}
切面类
package com.spring.Aop.demoXML;
public class User {
private String username;
private String password;
public String getUsername() {
System.out.println("getUsername:"+username);
return username;
}
public void setUsername(String username) {
System.out.println("setUsername:"+username);
this.username = username;
}
public String getPassword() {
System.out.println("getPassword:"+password);
return password;
}
public void setPassword(String password) {
System.out.println("setPassword:"+password);
this.password = password;
}
}
主函数类
package com.spring.Aop.demoXML;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringMain {
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("BeansXML.xml");
User user = (User) context.getBean("user");
System.out.println("-----------------------------");
//User user = new User();
user.getUsername();
System.out.println("-----------------------------");
user.getPassword();
System.out.println("-----------------------------");
user.setUsername("admin1");
System.out.println("-----------------------------");
user.setPassword("123451");
System.out.println("-----------------------------");
user.getUsername();
System.out.println("-----------------------------");
user.getPassword();
}
}
2、使用注解配置
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<!-- aop配置文件 -->
<aop:aspectj-autoproxy/>
<bean id="user1" class="com.spring.Aop.demoAnnotation.User">
<property name="username" value="admin"/>
<property name="password" value="12345" />
</bean>
<bean id="log1" class="com.spring.Aop.demoAnnotation.Log"/>
</beans>
log切面类
package com.spring.Aop.demoAnnotation;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class Log {
@Pointcut("execution(* com.spring.Aop.demoAnnotation.User.*(..))")
public void logging(){System.out.println("pointcut切入点");}
@Before("logging()")
public void before(){
System.out.println("before之前");
}
@After("logging()")
public void after(){
System.out.println("after之后");
}
@AfterReturning(pointcut="logging()", returning="result")
public void afterReturning(Object result){
System.out.println("afterReturning:"+result);
}
}