spring aop 我的理解就是干杂活的,我们的web系统包含很多的组件,每个组件都有自己要干的活。但是总有需要干日志(log)、事务(transcation)、安全(secure)等杂活的。spring 提供这样一个组件专门干这些杂活那么其他组件就可以专注于做自己的事情。
由于之前算是零基础,这里需要了解spring boot的注解的含义,我通过注解的形式实现spring aop。
我们通常把系统分为业务层、持久层、控制层等。
spring容器就是bean的居住点,而spring的居住点就是BeanFactor 这个接口
常用的容器类ClassPathXmlApplicationContext、AnnotationConfigApplicationContext、 AnnotationConfigWebApplicationContext、FileSystemApplicationContex
等都是BeanFactory的子类或者实现类
AnnotationConfigApplicationContext这个容器专门为注解设计的
如果一个类带了以下注解将自动注册到容器中,不需要单独定义bean或者加@bean
@Service 一般标注业务层 ,可以自定义bean名字,@Service(“aaaaa”) 这样来指定
@Repository 一般标注持久层,即Dao组件
@Controller 一般标注控制层
@Component 一般标注泛指组件,当我们不好对组件进行归类的时候我们用Component标注
@Autoried 是spring默认的装配bean的注解,主要用在字段上。默认按照类型进行装配
@Resource是j2ee自带的装配bean的注解 默认按照安装名称进行装配
@Bean java是面向对象编程,每一个对象都要实例化后具化才可以调用对象的属性。bean就是对象注册到spring ioc容器中的代理
spring ioc是控制反转,由容器创建我们需要的对象不用自己创建。控制反转意思是创建对象的权限转移。
@Configuration 用于定义配置类,可替换xml配置类。被Configuration注解的类内部包含一个或多个被@Bean注解的方法,
这些bean将会被AnnotationConfigApplicationContext或者AnnotationConfigWebApplicationContext进行扫描,并用于构建bean定义和初始化spring容器
下面通过一个简单demo来实现aop
编写一个service
@Service public class ServiceTest { public void testAonnation(){ System.out.println("测试AnnotionConfigApplicationContext容器的调用方法"); } }
定义一个配置类
@Configuration //AnnotationConfigApplicationContext注解扫描路径下的类,相当于在xml中配置bean @ComponentScan("com.example.demo") @EnableAspectJAutoProxy public class MyConfig { }
在默认生成的main函数里使用AnnotationConfigApplicationContext容器调用我们的service服务
@SpringBootApplication public class AnnotationConfigApplication { public static void main(String[] args) { SpringApplication.run(AnnotationConfigApplication.class, args); //实例化容器AnnotationConfigApplicationContext通过注解的方式来把对应路径下的bean实例化 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class); ServiceTest service = context.getBean(ServiceTest.class); service.testAonnation(); } }
编写AOP监控类,拦截service中的方法
/** * * Created by Administrator on 2018/2/22 0022. */ @Aspect @Component public class Logback { /** * 第一个星号表示返回类型任意 * 第二个星号表示任意字符 * ..表示任一参数 */ @Pointcut("execution(* com.example.demo.ServiceTest.*(..))") public void logaop(){ } //@Before("logaop()") @After("logaop()") public void log(){ System.out.println("方法式拦截"); } }这里我们就算完成了,运行程序控制台打印
这里注意,创建spring boot工程我们需要在pom里面引入jar来实现aop
<!--aspectj支持--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.9</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.9</version> </dependency>