文档章节

Spring | IOC AOP 注解 简单使用

JAVA_冯文议
 JAVA_冯文议
发布于 06/23 03:20
字数 752
阅读 19
收藏 16

写在前面的话

很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不忘更新Spring的知识,这不就来了吗?

IOC

我想把类交给Spring,让他帮我创建对象,这应该怎么做?

1、类

package com.fengwenyi.learn.java.springioc;

import org.springframework.stereotype.Component;

/**
 * @author Wenyi Feng
 */
@Component
public class Person {
    
    private String name;

    public Person() {}

    public void sayHello() {
        System.out.format("%s说:Hello.", name);
    }

    // getter and setter
}

2、Controller

package com.fengwenyi.learn.java.springioc;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Wenyi Feng
 */
@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private Person person;

    @GetMapping("/hello")
    public String hello() {
        person.setName("Wenyi Feng");
        person.sayHello();
        return "s";
    }

}

3、浏览器访问

http://localhost:8080/test/hello

4、控制台 Say Hello

5、关于测试

有人说,测试时这样写的吗?

不!我只是喜欢这样,仅此而已。

AOP

1、业务

在这里,我用 @Service 代表我们要处理的业务: 吃饭

package com.fengwenyi.learn.java.springaop.service;

import org.springframework.stereotype.Service;

/**
 * @author Wenyi Feng
 */
@Service
public class EatService {

    public void eat() {
        System.out.println("吃饭了");
    }

}

2、AOP

分析:吃饭之前我们需要洗手,吃饭之后我们要擦嘴

package com.fengwenyi.learn.java.springaop;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author Wenyi Feng
 */
@Component
@Aspect
public class Clean {

    // @Pointcut("execution(* com.fengwenyi.learn.java.springaop.service..*.*(..))")
    @Pointcut("execution(* com.fengwenyi.learn.java.springaop.service.EatService.eat())")
    public void eat() {
    }

    /**
     * 方法执行之前
     */
    @Before("eat()")
    public void doBefore() {
        System.out.println("吃饭之前,吃手");
    }

    /**
     * 方法执行之后
     */
    @After("eat()")
    public void doAfter() {
        System.out.println("吃饭之后,擦嘴");
    }

}

3、测试代码

package com.fengwenyi.learn.java.springaop;

import com.fengwenyi.learn.java.springaop.service.EatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Wenyi Feng
 */
@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private EatService eatService;

    @GetMapping("/eat")
    public String eat() {
        eatService.eat();
        return "s";
    }

}

4、浏览器请求

http://localhost:8080/test/eat

5、控制台

Spring AOP

注解

1、注解

package com.fengwenyi.learn.java.restructure.ann;

import java.lang.annotation.*;

/**
 * @author Wenyi Feng
 */
@Target({ElementType.METHOD, ElementType.TYPE}) // 方法 / 类 或者 接口 / [filed 字段]
@Retention(RetentionPolicy.RUNTIME) // 运行时
@Inherited // extends class 有效(接口 抽象类 都无效)
@Documented
public @interface Description {

    String value();
}

2、接口

package com.fengwenyi.learn.java.restructure.ann;

/**
 * @author Wenyi Feng
 */
public interface Persion {

    String name();

    String age();

    @Deprecated
    void sind();

}

3、写一个类实现接口,并使用注解

package com.fengwenyi.learn.java.restructure.ann;

/**
 * @author Wenyi Feng
 */
@Description("Class Ann")
public class Child implements Persion {

    @Override
    @Description("Method Ann")
    public String name() {
        return null;
    }

    @Override
    public String age() {
        return null;
    }

    @Override
    public void sind() {

    }
}

4、注解解析

package com.fengwenyi.learn.java.restructure.ann;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/**
 * @author Wenyi Feng
 */
public class PerseAnn {

    public static void main(String[] args) {

        try {
            // 使用类加载器加载类
            Class c = Class.forName("com.fengwenyi.learn.java.restructure.ann.Child");

            // 找到类上的注解
            boolean isExistClassAnn = c.isAnnotationPresent(Description.class);
            if (isExistClassAnn) {
                // 拿到注解实例
                Description d = (Description) c.getAnnotation(Description.class);
                System.out.println(d.value());
            }

            // 找到方法上的注解
            Method[] methods = c.getMethods();
            for (Method method : methods) {
                boolean isExistMethodAnn = method.isAnnotationPresent(Description.class);
                if (isExistMethodAnn) {
                    Description d = method.getAnnotation(Description.class);
                    System.out.println(d.value());
                }
            }

            // 另一种解析方法
            for (Method method : methods) {
                Annotation [] annotations = method.getAnnotations();
                for (Annotation annotation : annotations) {
                    if (annotation instanceof Description) {
                        Description d = (Description) annotation;
                        System.out.println(d.value());
                    }
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

}

5、效果

注解 解析

资料

本节代码已上传至Github,点击下面的工程名,即可进入:JavaLearnProject

© 著作权归作者所有

共有 人打赏支持
上一篇: Java | enum 枚举类
下一篇: FreeMarker | 数据篇
JAVA_冯文议
粉丝 9
博文 40
码字总数 33285
作品 0
成都
高级程序员
私信 提问
加载中

评论(3)

f
fxtty

引用来自“Wenyi_Feng”的评论

引用来自“fxtty”的评论

是说我吗?
en ???

我也姓冯的哎,开个玩笑
JAVA_冯文议
JAVA_冯文议

引用来自“fxtty”的评论

是说我吗?
en ???
f
fxtty
是说我吗?
那些年,我们一起追的Spring

学无止境,但仍需及时总结。 自去年开始写作以来,写了一些关于Spring的文章,今天将它们汇总起来,一方面方便大家阅读,另一方面,也是一次小的复盘总结。 IOC 首先是Spring的IOC,也就是控...

SexyCode
08/14
0
0
IOC/AOP工具 - jBeanBox

jBeanBox是一个微形但功能较齐全的IOC/AOP工具适用于JAVA7+,利用了Java的初始化块实现的Java配置代替XML。jBeanBox采用Apache License 2.0开源协议。 其他一些IOC/AOP框架的问题: 1)Sprin...

yong9981
2016/07/25
0
14
Java面试中常问的Spring方面问题(涵盖七大方向共55道题,含答案)

Spring Framework 现在几乎已成为 Java Web 开发的标配框架。那么,作为 Java 程序员,你对 Spring 的主要技术点又掌握了多少呢?不妨用本文的问题来检测一下。 1、一般问题 1.1. 不同版本的...

Java高级架构
08/06
0
0
Spring 面试问题 TOP 50

Spring 面试问题 TOP 50 Spring Framework 现在几乎已成为 Java Web 开发的标配框架。那么,作为 Java 程序员,你对 Spring 的主要技术点又掌握了多少呢?不妨用本文的问题来检测一下。 本文...

静默虚空
08/02
0
0
Spring应用学习——IOC

Spring简介 1. Spring的出现是为了取代EJB(Enterprise JavaBean)的臃肿、低效、脱离现实的缺点。Spring致力于J2EE应用的各层(表现层、业务层、持久层)的解决方案,Spring是企业应用开发的...

江左煤郎
11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

NEO区块链-DAPP开发直通车-第零篇

什么是DAPP DAPP 是以太坊发明的词汇 Decentralized Application. 目前基于区块链技术开发的应用程序广泛的接受使用了这一名称。 NEL将为开发DAPP提供全面的服务 什么是NEL NEL是 “NewEcon...

NEO-FANS
8分钟前
0
0
可视化软件VisIt在Ubuntu18.04上的安装

可视化软件VisIt在Ubuntu18.04上的安装 参考文档及使用说明 1.下载 在官网下载页面下载合适版本的安装文件,Ubuntu有专用的 https://wci.llnl.gov/simulation/computer-codes/visit/executa...

佚文
14分钟前
0
0
GROUP BY GROUPING SETS

GROUPING SETS 子句是 SELECT 语句的 GROUP BY 子句的扩展。通过 GROUPING SETS 子句,您可采用多种方式对结果分组,而不必使用多个 SELECT 语句来实现这一目的。这就意味着,能够减少响应时...

hblt-j
24分钟前
2
0
selenium之表格的定位

真的勇士, 敢于直面惨淡的warning、 敢于正视淋漓的error 目录 被测试网页的HTML代码 1.遍历表格所有单元格 2.定位表格中的某个元素 3.定位表格中的子元素 总结 浏览器网页常常会包含各类表...

程序猿拿Q
29分钟前
1
0
adb命令启动展讯平台工厂模式

adb命令启动展讯工厂模式: adb shell am start com.sprd.engineermode/com.sprd.engineermode.EngineerModeActivity 其它系统应用启动命令: 其他的一些应用启动命令,如下所示: calendar...

东街小霸王
29分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部