Spring注解补充(一)
注解补充
挑一些常用,但是深入不多的总结一下。
Bean的声明周期
在@Bean注解中,添加init属性和destroy属性
@Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
public User user() {
return new User();
}
使用@PostContructor和@PreDestory
官网描述:
官网说这 JSR-250的@PostConstruct和@PreDestroy注解通常被认为是在现代Spring应用程序中接收生命周期回调的最佳实践。


代码实现:
自己定义初始化和结束的方法,分别加上两个注解。
@PostConstruct
public void initJSR250(){
System.out.println("User.initJSR250");
}
@PreDestroy
public void destroyJSR250(){
System.out.println("User.destroyJSR250");
}
实现InitializingBean 以及DisposableBean 接口
代码实现:
public class User implements InitializingBean, DisposableBean {
......
@Override
public void destroy() throws Exception {
System.out.println("User.destroy ---- bean");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("User.afterPropertiesSet ----- bean");
}
}
这些声明周期的注解、方法或者属性有着明显的先后顺序。
简单测试:
/*
* Copyright (c) 2006, 2023, wuyahan 编写
*
*/
package cn.lele.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* <p>Project: ssm - User
* <p>Powered by wuyahan On 2023-02-24 09:36:11
*
* @author wuyahan [tianwenle2000@163.com]
* @version 1.0
* @since 17
*/
@Data
@AllArgsConstructor
public class User implements InitializingBean, DisposableBean {
private int id;
private String name;
private boolean sex;
public User(){
System.out.println("User类的构造方法执行");
}
public void save(){
System.out.println("User.save方法执行了");
}
@PostConstruct
public void initJSR250(){
System.out.println("User.initJSR250---------->@PostConstruct");
}
@PreDestroy
public void destroyJSR250(){
System.out.println("User.destroyJSR250----------->@PreDestroy");
}
public void initMethod(){
System.out.println("User.initMethod------->@Bean属性");
}
public void destroyMethod(){
System.out.println("User.destroyMethod-------->@Bean属性");
}
@Override
public void destroy() throws Exception {
System.out.println("User.destroy ----> 实现Spring提供的接口");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("User.afterPropertiesSet ----> 实现Spring提供的接口");
}
}
运行测试:
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
User user = context.getBean(User.class);
user.save();
context.close();
}
}
运行结果:

可以发现执行顺序: JSR250的两个注解 > 实现Spring提供的接口 > 在@Bean中的属性
简单查看源码
自己构建Spring源码项目真的很好用,阅读起来也方便,还能自己加注释。
当前版本: Spring 5.3.x
将断点打在设置的Bean属性的初始化方法上,通过Debug的调用栈可以发现:


继续把Debug调试在1800行:

当beanName为user时,JSR250已经执行。

执行下一步:

可以发现 实现Spring的初始化和关闭的接口以及给Bean添加初始化方法和关闭的方法是在一起执行的。
继续跟进1800行的代码,给这两行代码打上断点:

继续Debug:

执行下一步:

继续执行下一步:

可以发现Spring提供的两个接口执行顺序在自己给Bean添加属性的上面,所以先执行实现那两个接口的方法。
继续给User的JSR250注解的初始化方法加上断点:

继续执行下一步:



可以发现在1796行的代码就是JSR250注解的方法的入口。

所以 对比三个初始化方法的源码位置,可以发现:JSR250 > 实现Spring的两个接口 > Bean属性添加方法 。
额外补充:在1796行代码继续跟进,发现里面是对BeanPostProcessor的处理。这个后面再继续补充。
@Import导入
基本导入
注入一个类:
public class User {
}
在配置类上导入:
@ComponentScan("cn.lele")
@Import(User.class)
public class AppConfig {
}
输出容器中Bean的名字:
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
for (String name : context.getBeanDefinitionNames()) {
System.out.println("name = " + name);
}
}
}

实现ImportSelector接口

在配置类上导入:
@ComponentScan("cn.lele")
@Import({User.class, MySelector.class})
public class AppConfig {
}
查看导入Bean的名字:

实现MyImportBeanDefinitionRegistar接口
我们可以在ioc容器创建时,管理并且注册bean。通过实现MyImportBeanDefinitionRegistar接口。

在配置类上导入:
@ComponentScan("cn.lele")
@Import({MyImportBeanDefinitionRegistrar.class, MySelector.class})
public class AppConfig {
}
查看容器中所有Bean的名字:

@CompnentScan包扫描
这个注解还是有一些小坑的......
包含include小坑

CompnentScan注解默认开启自动检测带有@Component、@Repository、@Service、@Controller。所以就会有一个坑,当我们默认去include的时候,如果不关闭默认过滤,添加将不会发挥作用。
当我们只想加载Service注解和Controller注解的时候,如果不取消默认的扫描,包含将会失效:

取消默认扫描:

排除不受影响
自定义扫描CUSTOM
自定义扫描需要实现TypeFilter 接口
public class MyTypeFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
// 获取Bean的名字
String className = metadataReader.getClassMetadata().getClassName();
// 包含Dao的允许加载
if (className.toUpperCase().contains("DAO")){
return true; //允许加载
}
return false; // 不允许加载
}
}
type选择为FilterType.CUSTOM
@Configuration
@ComponentScan(
value = "cn.lele" ,
includeFilters = @ComponentScan.Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class}),
useDefaultFilters = false // 包含都需要关闭这个默认过滤
)
public class AppConfig {
}
运行结果:

Spring注解补充(一)的更多相关文章
- spring注解式参数校验
很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者返回异常时的校验信息,在代码中相当冗长,今天我们就来学习spring注解式参数校验. 其实就是:hibernate的validator. 开始啦. ...
- spring注解-@Autowired。@Resource。@Service
Spring的@Autowired注解.@Resource注解和@Service注解 什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: ...
- 0、Spring 注解驱动开发
0.Spring注解驱动开发 0.1 简介 <Spring注解驱动开发>是一套帮助我们深入了解Spring原理机制的教程: 现今SpringBoot.SpringCloud技术非常火热,作 ...
- Spring 注解无效 空指针异常
对于Java开发,现在Spring已成为一种生态,使用Spring成为一种享受,Spring的使用让开发变得更加便捷. 而Spring好用归好用,若不清楚里面的工作原理,使用的时候难免会踩到一些坑. ...
- 浅尝Spring注解开发_AOP原理及完整过程分析(源码)
浅尝Spring注解开发_AOP原理及完整过程分析(源码) 浅尝Spring注解开发,基于Spring 4.3.12 分析AOP执行过程及源码,包含AOP注解使用.AOP原理.分析Annotation ...
- Spring注解开发_Spring容器创建概述
浅尝Spring注解开发_Spring容器创建概述 浅尝Spring注解开发,基于Spring 4.3.12 概述Spring容器创建的过程,包括12个方法的执行 浅尝Spring注解开发_自定义注册 ...
- spring注解源码分析--how does autowired works?
1. 背景 注解可以减少代码的开发量,spring提供了丰富的注解功能.我们可能会被问到,spring的注解到底是什么触发的呢?今天以spring最常使用的一个注解autowired来跟踪代码,进行d ...
- Spring注解
AccountController .java Java代码 1. /** 2. * 2010-1-23 3. */ 4. packag ...
- spring 注解的优点缺点
注解与XML配置的区别 注解:是一种分散式的元数据,与源代码耦合. xml :是一种集中式的元数据,与源代码解耦. 因此注解和XML的选择上可以从两个角度来看:分散还是集中,源代码耦合/解耦. 注解的 ...
- spring注解说明之Spring2.5 注解介绍(3.0通用)
spring注解说明之Spring2.5 注解介绍(3.0通用) 注册注解处理器 方式一:bean <bean class="org.springframework.beans.fac ...
随机推荐
- 14 STL-常用算法
重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦! 每一次学习都是为了追求智慧! 写在前面,本篇章主要介绍STL中常用算法. 算法主要由 ...
- 【大数据课程】高途课程实践-Day01:Python编写Map Reduce函数实现各商品销售量展示(类似wordcount)
〇.概述 1.工具 http://www.dooccn.com/python3/ 在线运行Python代码 2.步骤 (1)⽣成代码测试数据 (2)编写Mapper逻辑 (3)编写Reducer逻辑 ...
- jsvmp_wencai
网站 aHR0cDovL3d3dy5pd2VuY2FpLmNvbS91bmlmaWVkd2FwL2hvbWUvaW5kZXg= 直接搜索关键词 下面是要抓取的数据 逆向位置(一个即可) hook到he ...
- 正则爬取豆瓣Top250数据存储到CSV文件(6行代码)
利用正则爬取豆瓣TOP250电影信息 电影名字 电影年份 电影评分 评论人数 import requests import csv import re # 不算导包的话正式代码6行 存储到csv文件 ...
- BBS项目(二): 登录功能 首页导航条搭建 首页主体部分 个人站点页面搭建 文章分类与标签 日期归档
目录 登录功能 pillow模块生成验证码 前端发送ajax请求 后端auth模块校验 sweetalert弹窗提示登录失败 首页导航条搭建 修改密码 退出登录 首页主体部分 首页前端框架搭建 adm ...
- Spark框架下均值漂移算法对舆情聚类的分析
知网链接 原文链接 张京坤, 王怡怡 软件导刊 2022年21卷第6期 页码:141-146 DOI:10.11907/rjdk.211889 中图分类号:TP274 纸质出版日期:202 ...
- JSONObject 相关
/** * 将json转为对应实体类 */ public static Object jsonToJavaObj(String json, Class cs) { return jsonToJavaO ...
- 使用IDEA搭建SSM项目
使用IDEA搭建SSM项目 摘要:前几天学习了SSM项目的搭建,但是因为配置过程中出现了问题因此没有搭起来,我最讨厌不确定的事情,因此自己花费了点时间钻研搭建SSM项目的方法,终于习得了SSM项目 ...
- Java学习笔记:2022年1月13日(其一)
Java学习笔记:2022年1月13日(其一) 摘要:这篇笔记主要讲解了Java中的自定义类.以及构造一个类时所需要了解的一些重点知识. 目录 Java学习笔记:2022年1月13日(其一) 1. ...
- 【ASP.NET Core】用配置文件来设置授权角色
在开始之前,老周先祝各个次元的伙伴们新春快乐.生活愉快.万事如意. 在上一篇水文中,老周介绍了角色授权的一些内容.本篇咱们来聊一个比较实际的问题--把用于授权的角色名称放到外部配置,不要硬编码,以方便 ...
