• Spring基础:注解实现AOP


    注解实现AOP操作

    了解了如何使用注解注册Bean之后,我们接着来看如何通过注解实现AOP操作,首先我们需要在主类添加@EnableAspectJAutoProxy注解,开启AOP注解支持:

    1. @EnableAspectJAutoProxy
    2. @ComponentScan("com.test.bean")
    3. @Configuration
    4. public class MainConfiguration {
    5. }

    接着我们只需在定义AOP增强操作的类上添加@Aspect注解和@Component将其注册为Bean即可,就像我们之前在配置文件中也要将其注册为Bean:

    1. @Component
    2. @Aspect
    3. public class AopTest {
    4. }

    接着,我们直接在里面编写方法,并将此方法添加到一个切点中,比如我们希望在Student的test方法执行之前执行我们的方法:

    1. public int test(String str){
    2. System.out.println("我被调用了:"+str);
    3. return str.length();
    4. }

    只需要添加@Before注解即可:

    1. @Before("execution(* com.test.bean.Student.test(..))")
    2. public void before(){
    3. System.out.println("我是之前执行的内容!");
    4. }

    同样的,我们可以为其添加JoinPoint参数来获取切入点信息:

    1. @Before("execution(* com.test.bean.Student.test(..))")
    2. public void before(JoinPoint point){
    3. System.out.println("参数列表:"+ Arrays.toString(point.getArgs()));
    4. System.out.println("我是之前执行的内容!");
    5. }

    我们也可以使用@AfterReturning注解来指定方法返回后的操作:

    1. @AfterReturning(value = "execution(* com.test.bean.Student.test(..))", returning = "returnVal")
    2. public void after(Object returnVal){
    3. System.out.println("方法已返回,结果为:"+returnVal);
    4. }

    我们还可以指定returning属性,并将其作为方法某个参数的实参。同样的,环绕也可以直接通过注解声明:

    1. @Around("execution(* com.test.bean.Student.test(..))")
    2. public Object around(ProceedingJoinPoint point) throws Throwable {
    3. System.out.println("方法执行之前!");
    4. Object val = point.proceed();
    5. System.out.println("方法执行之后!");
    6. return val;
    7. }

    其他注解配置

    配置文件可能不止一个,我们有可能会根据模块划分,定义多个配置文件,这个时候,可能会出现很多个配置类,如果我们需要@Import注解来快速将某个类加入到容器中,比如我们现在创建一个新的配置文件,并将数据库Bean也搬过去:

    1. public class Test2Configuration {
    2. @Bean
    3. public Connection getConnection() throws SQLException {
    4. System.out.println("创建新的连接!");
    5. return DriverManager.getConnection("jdbc:mysql://localhost:3306/study",
    6. "root",
    7. "root");
    8. }
    9. }

    1. @EnableAspectJAutoProxy
    2. @Configuration
    3. @ComponentScan("com.test")
    4. @Import(Test2Configuration.class)
    5. public class TestConfiguration {
    6. @Resource
    7. Connection connection;
    8. @PostConstruct
    9. public void init(){
    10. System.out.println(connection);
    11. }
    12. }

    注意另一个配置类并没有添加任何注解,实际上,相当于导入的类被强制注册为了一个Bean,到现在,我们一共了解了三种注册为Bean的方式,利用这种特性,我们还可以将其他的类型也强制注册为Bean:

    1. @EnableAspectJAutoProxy
    2. @Configuration
    3. @ComponentScan("com.test")
    4. @Import({Test2Configuration.class, Date.class})
    5. public class TestConfiguration {
    6. @Resource
    7. Connection connection;
    8. @Resource
    9. Date date;
    10. @PostConstruct
    11. public void init(){
    12. System.out.println(date+" -> "+connection);
    13. }
    14. }

    可以看到,日期直接作为一个Bean放入到IoC容器中了,并且时间永远都是被new的那个时间,也就是同一个对象(因为默认是单例模式)。

    通过@Import方式最主要为了实现的目标并不是创建Bean,而是为了方便一些框架的Registrar进行Bean定义,在讲解到Spring原理时,我们再来详细讨论,目前只做了解即可。

  • 相关阅读:
    求解为什么登录校园网账户的网页打不开
    2022“杭电杯”中国大学生算法设计超级联赛(3)
    【TypeScript】类的基本使用
    6763个gb2312汉字笔画分析
    JS操作DOM及CSS
    【计组】为什么计算机采用补码进行运算?
    『现学现忘』Docker基础 — 34、DockerFile文件详解
    向AI提问,我是怎么做的?
    Python 基于人脸识别的实验室智能门禁系统的设计,附可视化界面
    关于语言大模型的八大论断
  • 原文地址:https://blog.csdn.net/Leon_Jinhai_Sun/article/details/126205733