目录
半注解形式:
业务层接口+实现类:
public interface UserService {
public void save();
}
@Service
public class UserServiceImpl implements UserService {
//保存方法
// @Override
public void save() {
System.out.println("业务层方法执行了!!!");
//int i=5/0;
}
}
编写切面类:
/**
* @Component // 把该类交给IOC去管理
* @Aspect // 声明是切面类 == <aop:aspect ref="myXmlAspect">
*/
@Component
@Aspect
public class MyAnnoAspect {
/**
* 通知的方法
*/
// @Before(value = "切入点的表达式")
@Before("execution(public void com.qcby.demo1.UserServiceImpl.save())")
public void log(){
System.out.println("前置方法执行了!!");
}
}
在配置文件里面唯一需要加的:
1、开启注解扫描:
2、开启aop自动代理:
<?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.xsd">
<!--开启注解扫描 扫描所有被spring管理的类-->
<context:component-scan base-package="com.qcby"/>
<!--开启AOP注解支持-->
<aop:aspectj-autoproxy/>
</beans>
测试类:
/**
* 测试类
* 测试AOP的增强
* @RunWith(SpringJUnit4ClassRunner.class) 声明为测试单元
* @ContextConfiguration("classpath:applicationContext.xml") 加载配置文件
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestDemo1 {
@Autowired
private UserService userService;
@Test
public void run(){
userService.save();
}
}
运行结果:
全注解形式:
不要配置文件,改为配置类:
@Configuration // 配置类
@ComponentScan(value = "com.qcby") // 扫描包
@EnableAspectJAutoProxy // 开启自动代理 == <aop:aspectj-autoproxy />
public class SpringConfig {
}
同样的业务层接口+实现类:
public interface UserService {
public void save();
}
@Service
public class UserServiceImpl implements UserService {
//保存方法
// @Override
public void save() {
System.out.println("业务层方法执行了!!!");
//int i=5/0;
}
}
同样的自定义切面类:
/**
* @Component // 把该类交给IOC去管理
* @Aspect // 声明是切面类 == <aop:aspect ref="myXmlAspect">
*/
@Component
@Aspect
public class MyAnnoAspect {
/**
* 通知的方法
*/
// @Before(value = "切入点的表达式")
@Before("execution(public void com.qcby.demo1.UserServiceImpl.save())")
public void log(){
System.out.println("前置方法执行了!!");
}
}
测试类改为不加载配置文件加载配置类:
/**
* 测试类
* 测试AOP的增强
* @RunWith(SpringJUnit4ClassRunner.class) 声明为测试单元
* @ContextConfiguration("classpath:applicationContext.xml") 加载配置文件
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class TestDemo1 {
@Autowired
private UserService userService;
@Test
public void run(){
userService.save();
}
}
运行结果: