xml配置完成AOP
什么是AspectJ
:面向切面编程框架
它扩展了Java(它也是一种语言)
支持原生Java代码
他有自己的编译器 将代码翻译成标准Java字节码
方便编写AOP代码而出现
使用AOP思路
三个重点 通知 切点 织入
1.xml配置完成AOP
创建通知类 添加需要的方法
在配置文件中添加通知类的bean
添加<aop:config> 添加子标签 pointCut
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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
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-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<bean name="abc" class="com.lanou.adivce.MyAdvice"></bean>
<aop:config>
<aop:pointcut expression="execution(* com.lanou.DaoImpl.*DaoImpl.*(..))" id="pc"/>
<aop:aspect ref="abc">
<aop:before method="before" pointcut-ref="pc"/>
<aop:around method="around" pointcut-ref="pc"/>
<aop:after method="after" pointcut-ref="pc"/>
<aop:after-returning method="returning" pointcut-ref="pc"/>
<aop:after-throwing method="throwing" pointcut-ref="pc"/>
</aop:aspect>
</aop:config>
<context:component-scan base-package="com.lanou"></context:component-scan>
</beans>
"execution(* com.lanou.DaoImpl.*DaoImpl.*(..))" id="pc"/>
第一个*代表任意返回值 第二个*代表任意类 第三个*代表任意方法 ..代表任意参数
User.java
package com.lanou.entity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;
@Repository
public class User {
private String name;
public String getName() {
return name;
}
@Value("小明")
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [name=" + name + "]";
}
}
这里面的注解是用来输入数据的 配置AOP还是用配置文件配置的
UserDao.java
package com.lanou.dao;
import com.lanou.entity.User;
public interface UserDao {
public void addUser(User u);
public void deleteUser(User u);
}
UserDaoImpl.java
package com.lanou.DaoImpl;
import org.springframework.stereotype.Repository;
import com.lanou.dao.UserDao;
import com.lanou.entity.User;
@Repository
public class UserDaoImpl implements UserDao{
@Override
public void addUser(User u) {
System.out.println("添加用户");
}
@Override
public void deleteUser(User u) {
System.out.println("删除用户");
}
}
MyAdvice.java
package com.lanou.adivce;
import org.aspectj.lang.ProceedingJoinPoint;
public class MyAdvice{
public void before() {
System.out.println("前置");
}
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕增强前 ");
Object result = pjp.proceed();
System.out.println("环绕增强后 ");
System.out.println(1/0);
return result;
}
public void after() {
System.out.println("后置");
}
public void returning() {
System.out.println("After returning 后置");
}
public void throwing() {
System.out.println("发生异常了");
}
}
MyTest.java
import org.junit.Test
import org.junit.runner.RunWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.test.context.ContextConfiguration
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner
import com.lanou.dao.UserDao
import com.lanou.entity.User
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class MyTest {
// 注入UserDao
@Autowired
private UserDao userDao
@Autowired
private User user
@Test
public void test() {
userDao.addUser(user)
}
}
注解完成AOP
创建通知类
添加@Aspect设置通知类
创建切点方法
给通知方法加上相应的注解
after before ....
User.java
import org.springframework.stereotype.Repository;
@Repository
public class User {
private String name;
public String getName() {
return name;
}
@Value("小明")
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [name=" + name + "]";
}
}
UserDao.java
package com.lanou.dao;
import com.lanou.entity.User;
public interface UserDao {
public void addUser(User u);
public void deleteUser(User u);
}
UserDaoImpl.java
@Repository
public class UserDaoImpl implements UserDao{
@Override
public void addUser(User u) {
System.out.println("添加用户");
}
@Override
public void deleteUser(User u) {
System.out.println("删除用户");
}
}
MyAdvice_annotion.java
@Aspect
public class MyAdvice_annotion{
@Pointcut("execution(* com.lanou.DaoImpl.*.*(..))")
private void point() {}
@Before("point()")
public void before() {
System.out.println("前置");
}
@Around("point()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕增强前 ");
Object result = pjp.proceed();
System.out.println("环绕增强后 ");
return result;
}
@After("point()")
public void after() {
System.out.println("后置");
}
@AfterReturning("point()")
public void returning() {
System.out.println("After returning 后置");
}
@AfterThrowing("execution(* com.lanou.DaoImpl.*.*(..))")
public void throwing() {
System.out.println("发生异常了");
}
}
applicationContext2.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"
xmlns:context="http://www.springframework.org/schema/context"
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-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<bean name="abc" class="com.lanou.adivce.MyAdvice_annotion"></bean>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<context:component-scan base-package="com.lanou"></context:component-scan>
</beans>
MyTest.java
import com.lanou.dao.UserDao;
import com.lanou.entity.User;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class MyTest {
@Autowired
private UserDao userDao;
@Autowired
private User user;
@Test
public void test() {
userDao.addUser(user);
}
}