IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring框架(六):Spring相关注解复习 -> 正文阅读

[Java知识库]Spring框架(六):Spring相关注解复习

本文将对Spring中的注解进行大致说明
(备注:假如想要查询某个注解,可以使用快捷键Ctrl+F查询)

0、创建对象

附: 下面四种都可以创建出对象,功能完全一样,只是约定使用的层不同
(1)@Component ——对象创建(当我们的类不属于各种归类的时候,就可以使用@Component来标注这个类)
(2)@Service——用于业务层的bean对象创建——对应serviceimpl实现类
(3)@Controller——用于表现层的bean对象创建——对应controller类
(4)@Repository——用于数据层的bean对象创建——对应Dao接口

1、SpringConfig核心配置类

@Configuration //声明当前类为Spring配置类
@ComponentScan("com.itheima")//开启注解扫描,扫描路径:相对于root源文件的路径
@PropertySource("classpath:jdbc.properties")//加载外部文件,classpath:相对于resources包下文件
@EnableAspectJAutoProxy///告诉SpringConfig 开启注解开发AOP功能
@Import({JdbcConfig.class,MybatisConfig.class})//导入其他配置类的信息(目的:将配置类分类,然后导入Spring配置类)
@EnableTransactionManagement//开启注解式事务驱动
public class SpringConfig {
}

2、其他配置类

例:JdbcConfig
@Value 注入字符串,这里使用EL表达式(搭配@PropertySource注解使用,获取外部文件的属性)
@Bean:将(方法的返回值)上传/注册到Spring容器中

public class JdbcConfig {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String userName;
    @Value("${jdbc.password}")
    private String password;

    @Bean//上传方法的返回对象ds到容器中
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(userName);
        ds.setPassword(password);
        return ds;
    }
}

3、aop.切面类(通知类)

@Component//创建/注册对象到Spring容器中
@Aspect//设置当前类为切面类,告知Spring容器这是一个切面的通知类
(与@EnableAspectJAutoProxy搭配Spring核心配置类的使用–告诉SpringConfig 开启注解开发AOP功能)

@Pointcut(“execution(boolean com.itheima.service.Service.(,))”)//设置切入点,要求配置在方法上方

@Component
@Aspect
public class DataAdvice {
    @Pointcut("execution(boolean com.itheima.service.*Service.*(*,*))")
    private void servicePt(){}

    //该环绕通知的目的:获取并处理原始方法的字符串参数,去掉两边的空格
    @Around("servicePt()")
    public Object trimStr(ProceedingJoinPoint pjp) throws Throwable {
        Object[] args = pjp.getArgs();
        for (int i = 0; i < args.length; i++) {
            //判断参数是不是字符串类型
            if(args[i].getClass().equals(String.class)){
                args[i] = args[i].toString().trim();
            }
        }
        Object ret = pjp.proceed(args);
        return ret;
    }
}

4、五种通知(通知也是写在通知类中)

  1. @Before(“切入点”),前置通知——通知方法在切入点(方法前)运行
  2. @After(“切入点”),后置通知——通知方法在切入点(方法后)运行
  3. @Around(“切入点”),环绕通知(重点)——前后都运行
  4. @AfterReturning(value = “pt()”,returning = “ret”),
    返回后通知(了解):返回后通知,在原始方法执行完毕后运行,且原始方法执行过程中未出现异常现象
  5. @AfterThrowing(value = “pt()”,throwing = “t”),
    抛出异常后通知(了解):抛出异常后通知,在原始方法执行过程中出现异常后运行

附:JoinPoint:用于描述切入点的对象,必须配置成通知方法中的第一个参数,可用于获取原始方法调用的参数(ProceedingJoinPoint接口是JoinPoint的子接口)


@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
    private void pt(){}

    //JoinPoint:用于描述切入点的对象,必须配置成通知方法中的第一个参数,可用于获取原始方法调用的参数
    @Before("pt()")
    public void before(JoinPoint jp) {
        Object[] args = jp.getArgs();
        System.out.println(Arrays.toString(args));
        System.out.println("before advice ..." );
    }

    @After("pt()")
    public void after(JoinPoint jp) {
        Object[] args = jp.getArgs();
        System.out.println(Arrays.toString(args));
        System.out.println("after advice ...");
    }

    //ProceedingJoinPoint:专用于环绕通知,是JoinPoint子类,可以实现对原始方法的调用
    @Around("pt()")
    public Object around(ProceedingJoinPoint pjp) {
        Object[] args = pjp.getArgs();
        System.out.println(Arrays.toString(args));
        args[0] = 666;
        Object ret = null;
        try {
            ret = pjp.proceed(args);
        } catch (Throwable t) {
            t.printStackTrace();
        }
        return ret;
    }

    //设置返回后通知获取原始方法的返回值,要求returning属性值必须与方法形参名相同
    @AfterReturning(value = "pt()",returning = "ret")//如果原始方法中有返回值,就将该返回值放到形参ret中去
    public void afterReturning(JoinPoint jp,Object ret) {
        System.out.println("afterReturning advice ..."+ret);
    }

    //设置抛出异常后通知获取原始方法运行时抛出的异常对象,要求throwing属性值必须与方法形参名相同
    @AfterThrowing(value = "pt()",throwing = "t")
    public void afterThrowing(Throwable t) {
        System.out.println("afterThrowing advice ..."+t);
    }
}

5、自动装配

5.1根据类型自动装配(注入引用类型)
@Autowired

5.2 根据bean名称装配
@Autowired
@Qualifier(“id名称”):自动装配bean时按bean名称装配

@Service
public class BookServiceImpl implements BookService {
    //@Autowired:注入引用类型,自动装配模式,默认按类型装配
    
    @Autowired
    @Qualifier("bookDao")//@Qualifier:自动装配bean时按bean名称装配
    private BookDao bookDao;

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}

附:注解开发的作用范围与生命周期管理(了解)

@Scope设置bean的作用范围
//singleton 单实例对象(运行两次都是同一个对象)
//prototype 多实例对象

@PostConstruct设置bean的初始化方法

@PreDestroy设置bean的销毁方法

package com.itheima.dao.impl;

import com.itheima.dao.BookDao;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;


@Repository
//@Scope设置bean的作用范围
//singleton 单实例对象(运行两次都是同一个对象)
// prototype 多实例对象
@Scope("singleton")
public class BookDaoImpl implements BookDao {

    public void save() {
        System.out.println("book dao save ...");
    }
    //@PostConstruct设置bean的初始化方法
    @PostConstruct
    public void init() {
        System.out.println("init ...");
    }
    //@PreDestroy设置bean的销毁方法
    @PreDestroy
    public void destroy() {
        System.out.println("destroy ...");
    }

}

附:@Alias给pojo起别名

@Alias("user")
public class User{
    ...}

6、事务

@EnableTransactionManagement//开启注解式事务驱动
@Transactional的作用:配置当前接口方法具有事务(业务层接口或这实现类)

//配置当前接口方法具有事务
@Transactional(rollbackFor = IOException.class)//rollbackFor设置事务回滚异常(class)
    public void transfer(String out,String in ,Double money) ;

专栏文章:
Spring框架(一):概述及简单使用(基于XML方式)

Spring框架(二):注解开发及快速入门

Spring框架(三):Spring整合Mybaits、Junit

Spring框架(四):AOP面向切面编程

Spring框架(五):Spring事务简述(注解方式)

Spring框架(六):Spring注解简述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 18:48:02  更:2022-05-21 18:50:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 11:54:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码