SpringIOC以及AOP注解开发

新建一个maven项目
Spring 为了知道程序员在哪些地方标记了什么注解,就需要通过扫描的方式,来进行检测。然后根据注解进行后续操作。
pom.xml
<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>org.example</groupId>
<artifactId>spring-aop</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>spring-aop</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<!--这里是设置作用域-->
<!--注释作用域,表明我想让它为全局使用-->
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
</project>
注解开发的话当然需要配置类

@Configuration //这个类就是配置类相当于配置文件
@ComponentScan
用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类自动装配到bean容器里。会被自动装配的注解包括@Controller、@Service、@Component、@Repository等等。与ComponentScan注解相对应的XML配置就是<context:component-scan/>, 根据指定的配置自动扫描package,将符合条件的组件加入到IOC容器中;
@EnableAspectJAutoProxy

package lps.config; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy; /**
* @author 阿水
* @create 2023-02-23 14:52
*/
@Configuration
@ComponentScan({"lps"})
@EnableAspectJAutoProxy
public class SpringConfig {
}
①使用@Component注解标记的普通组
②使用@Controller注解标记的控制器组件
③使用@Service注解标记的业务逻辑组件
④使用@Repository注解标记的持久化层组件




@Autowired和@Resource区别
提供方不同
@Autowired 是Spring提供的,@Resource 是J2EE提供的。
装配时默认类型不同
@Autowired只按type装配,@Resource默认是按name装配。

切入点表达式的写法-execution函数
关键字:execution(表达式)
表达式:访问修饰符 返回值 包名.包名.包名...类名.方法名
| 规则 | 表达式 | 示例 |
|---|---|---|
| 匹配所有类的public方法 | execution(public **(..)) | |
| 匹配指定包下所有类的方法(不包含子包) | execution(* 包名.*(..)) | execution(* test.aop.t1.*(..)) |
| 匹配指定包下所有类的方法(包含子包) | execution(* 包名.**(..)) | execution(* test.aop.t1..*(..)) |
| 匹配指定类下的所有方法 | execution(* 包名.类名.*(..)) | execution(* test.aop.t1.UserDao.*(..)) |
| 匹配指定类下的指定方法 | execution(* 包名.类名.方法名(..)) | execution(* test.aop.t1.UserDao.add(..)) |
| 匹配实现指定接口的所有类的方法 | execution(* 包名.接口名+*(..)) | execution(* test.aop.t1.UserDao+*(..)) |
| 匹配所有名称以save开头的方法 | execution(* save*(..)) |
Spring中的通知
Spring中一共有5种通知
前置通知(before)、后置通知(returning)、异常通知(throwing)、最终通知(after)、环绕通知(around)
复制代码
| 通知类型 | 作用 | 应用场景 |
|---|---|---|
| 前置通知 | 在目标方法执行前增强代码逻辑 | 权限控制(权限不足抛出异常)、记录方法调用信息日志 |
| 后置通知 | 在目标方法运行后返回值后再增强代码逻辑,在出现异常时不执行 | 与业务相关的,如银行在存取款结束后的发送短信消息 */ |
| 异常通知 | 目标代码出现异常,通知执行。记录异常日志、通知管理员(短信、邮件) | 处理异常(一般不可预知),记录日志 |
| 最终通知 | 不管目标方法是否发生异常,最终通知都会执行(类似于finally代码功能) | 释放资源 (关闭文件、 关闭数据库连接、 网络连接、 释放内存对象 ) |
| 环绕通知 | 目标方法执行前后,都进行增强(控制目标方法执行) | 日志、缓存、权限、性能监控、事务管理 |

UserService.java
package lps.service; import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service; /**
* @author 阿水
* @create 2023-02-23 14:50
*/
@Service("userService")
public class UserService {
/* public void sing(){
System.out.println("我爱唱歌");
}
public void dance(){
System.out.println("我爱跳舞");
}
public void rap() {
//int i=10/0;
System.out.println("我爱rap 篮球 起~");
}*/
public void doSum(){
long sum=0;
for (long i = 0; i < 1000000000; i++) {
sum+=i;
}
System.out.println(sum);
}
}

Aspect代码块
package lps.aspect; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component; import java.util.Date; /**
* @author 阿水
* @create 2023-02-23 15:18
*/
@Component
@Aspect
public class LoggerAspect {
//@Pointcut("execution(public * lps.service.*.*(..))")
@Pointcut("execution(* lps.*.*.*(..))")
private void pointcut() {
} /* @AfterReturning("pointcut()")
public void after() {
System.out.println("AfterReturning————————————————————你的鸡哥————————————————————");
} @Before("pointcut()")
public void before() {
System.out.println("Before________________________你的坤坤________________________");
}
*//* @Around("pointcut()")
public void around(){
System.out.println("_+++++环绕的鸡哥_+++++");
}*//*
@AfterThrowing("pointcut()")
public void logAfterThrowing(){
System.out.println("AfterThrowing出错啦 赶紧回来");
}
@After("pointcut()")
public void afterFinalyy() {
System.out.println("After最终通知 ");
}*/
@Around("pointcut()")
public Object test(ProceedingJoinPoint point){
Object result=null;
//long beginTime = System.currentTimeMillis();
long beginTime = new Date().getTime();
Object[] args = point.getArgs(); try {
result = point.proceed(args);
} catch (Throwable e) {
throw new RuntimeException(e);
} //long endTime = System.currentTimeMillis();
long endTime = new Date().getTime();
System.out.println("一起用了"+(endTime-beginTime)+"毫秒");
return result; } }
测试类
package lps.demo; import javafx.application.Application;
import lps.config.SpringConfig;
import lps.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; /**
* @author 阿水
* @create 2023-02-23 14:53
*/
public class test1 {
public static void main(String[] args) {
ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = (UserService) context.getBean("userService");
/* userService.sing();
userService.dance();
userService.rap();*/
userService.doSum(); }
}

SpringIOC以及AOP注解开发的更多相关文章
- Spring (二)SpringIoC和DI注解开发
1.Spring配置数据源 1.1 数据源(连接池)的作用 数据源(连接池)是提高程序性能出现的 事先实例化数据源,初始化部分连接资源 使用连接资源时从数据源中获取 使用完毕后将连接资源归还给数据源 ...
- Spring笔记04_AOP注解开发_模板_事务
目录 1. Spring基于AspectJ的注解的AOP开发 1. 1 SpringAOP的注解入门 1.2 Spring的AOP的注解通知类型 1.2.1 @Before:前置通知 1.2.2 @A ...
- Spring入门(三)— AOP注解、jdbc模板、事务
一.AOP注解开发 导入jar包 aop联盟包. aspectJ实现包 . spring-aop-xxx.jar . spring-aspect-xxx.jar 导入约束 aop约束 托管扩展类和被扩 ...
- Spring---AOP注解开发&jdbc模板&Spring事务管理
一.AOP注解开发 此处需要回忆一遍AOP的概念.简单的来说,AOP就是利用动态代理技术,做到不触动源代码但却扩展了功能.那么就需要一个被扩展的对象和一个“新的功能”,例如说给某类的saveUser方 ...
- springAop:Aop(Xml)配置,Aop注解配置,spring_Aop综合案例,Aop底层原理分析
知识点梳理 课堂讲义 0)回顾Spring体系结构 Spring的两个核心:IoC和AOP 1)AOP简介 1.1)OOP开发思路 OOP规定程序开发以类为模型,一切围绕对象进行,OOP中完成某个任务 ...
- springIOC、AOP的一些注解
springIOC.AOP的一些注解(使用这些注解之前要导入spring框架的一些依赖): 1.注入IOC容器 @Compontent:使用注解的方式添加到ioc容器需要在配置文件 ...
- Spring基于AspectJ的AOP的开发——注解
源码:https://gitee.com/kszsa/dchart 一, AspectJ的概述: AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专 ...
- (转)Spring使用AspectJ进行AOP的开发:注解方式
http://blog.csdn.net/yerenyuan_pku/article/details/69790950 Spring使用AspectJ进行AOP的开发:注解方式 之前我已讲过Sprin ...
- Spring_IoC注解开发和AOP的XML开发(学习笔记2)
一:IoC注解开发 1,在applicationContext.xml中需要引入context约束 <beans xmlns="http://www.springframework.o ...
- AOP注解方式ApsectJ开发
AOP注解方式ApsectJ开发 引入配置文件 编写切面类配置 使用注解的AOP对象目标类进行增强 在配置文件中开启以注解形式进行AOP开发 在切面类上添加注解 注解AOP通知类型 @Before前置 ...
随机推荐
- 日記かな、自分のサーバ作りの?(01、try…catch…の問題)
今日まだ終わらないうちに.昼間から出会ったbugについて.取りまとめましょう. 一応try-catch-にかかわる問題かな- try(do something){ }catch{ } と try(){ ...
- 实验1task5
<实验结论> #include <stdio.h> #include <stdlib.h> int main() { float a,b,c; printf(&qu ...
- 戴尔n4110在win7下无法使用virtualbox的解决方法(应该对win7都有用)
正文 因为已经学了一段时间的汇编了嘛,想着就拿单独一台机器出来学汇编好了,刚好趁着天气降温回学校拿被子的机会把笔记本也拿出来了,然后我装上了virtual box,把编译好的文件写到虚拟盘中,打开就直 ...
- Yocto Project Mega-Manual 英文版 (2020官方最新合并版575页),Yocto官方文档中文版,Yocto官方文档英文版
Yocto Project Mega-Manual-(2020官方最新合并版575页)-英文版 https://market.m.taobao.com/app/idleFish-F2e/widle-t ...
- NSQ(8)-有赞相关改进
如何保证消息队列的高可用(HA) NSQ 本身就是一个分布式消息队列,且支持水平扩展,无单点故障,能在无中断的情况下无缝添加集群结点. nsq用到了集群去保证整个服务的高可用,但并不能保证单个topi ...
- [Oracle19C 数据库管理] 加载和传输数据库
移动数据的通用架构 数据泵data pump(impdp, expdp),借助DBMS_DATAPUMP存储过程,可以进行表的导出导入,行记录的导出导入,表空间的导出导入或者整个schema的导出导入 ...
- Mamba安装
wget https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-pypy3-Linux-x86_64 ...
- C#和.NET Framework 简介
C#是一种通用的类型安全且面向对象编程的语言.这种语言的目标是提高程序员的生产力,为此需要在简单性.可表达性和性能之间实现平衡.C#语言的首席架构师从第一个版本开始就是Anders Hejlsberg ...
- JDBC之ResultSet和元数据
ResultSet 从名字上就可以看到是结果集,表示的是查询出来的结果集. JDBC用ResultSet来封装结果集,查询结果表的对象. 查询结果分为两种情况: 单值 单个结果,比如说SQL如下: s ...
- 点击dgv某列的单元格时触发事件的方法
private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.Colu ...