注解补充

挑一些常用,但是深入不多的总结一下。

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注解补充(一)的更多相关文章

  1. spring注解式参数校验

    很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者返回异常时的校验信息,在代码中相当冗长,今天我们就来学习spring注解式参数校验. 其实就是:hibernate的validator. 开始啦. ...

  2. spring注解-@Autowired。@Resource。@Service

    Spring的@Autowired注解.@Resource注解和@Service注解 什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: ...

  3. 0、Spring 注解驱动开发

    0.Spring注解驱动开发 0.1 简介 <Spring注解驱动开发>是一套帮助我们深入了解Spring原理机制的教程: 现今SpringBoot.SpringCloud技术非常火热,作 ...

  4. Spring 注解无效 空指针异常

    对于Java开发,现在Spring已成为一种生态,使用Spring成为一种享受,Spring的使用让开发变得更加便捷. 而Spring好用归好用,若不清楚里面的工作原理,使用的时候难免会踩到一些坑. ...

  5. 浅尝Spring注解开发_AOP原理及完整过程分析(源码)

    浅尝Spring注解开发_AOP原理及完整过程分析(源码) 浅尝Spring注解开发,基于Spring 4.3.12 分析AOP执行过程及源码,包含AOP注解使用.AOP原理.分析Annotation ...

  6. Spring注解开发_Spring容器创建概述

    浅尝Spring注解开发_Spring容器创建概述 浅尝Spring注解开发,基于Spring 4.3.12 概述Spring容器创建的过程,包括12个方法的执行 浅尝Spring注解开发_自定义注册 ...

  7. spring注解源码分析--how does autowired works?

    1. 背景 注解可以减少代码的开发量,spring提供了丰富的注解功能.我们可能会被问到,spring的注解到底是什么触发的呢?今天以spring最常使用的一个注解autowired来跟踪代码,进行d ...

  8. Spring注解

    AccountController .java Java代码   1.        /** 2.         * 2010-1-23 3.         */ 4.        packag ...

  9. spring 注解的优点缺点

    注解与XML配置的区别 注解:是一种分散式的元数据,与源代码耦合. xml :是一种集中式的元数据,与源代码解耦. 因此注解和XML的选择上可以从两个角度来看:分散还是集中,源代码耦合/解耦. 注解的 ...

  10. spring注解说明之Spring2.5 注解介绍(3.0通用)

    spring注解说明之Spring2.5 注解介绍(3.0通用) 注册注解处理器 方式一:bean <bean class="org.springframework.beans.fac ...

随机推荐

  1. 第2-4-10章 规则引擎Drools实战(3)-保险产品准入规则

    目录 9.3 保险产品准入规则 9.3.1 决策表 9.3.2 规则介绍 9.3.3 实现步骤 9.3 保险产品准入规则 全套代码及资料全部完整提供,点此处下载 9.3.1 决策表 前面我们编写的规则 ...

  2. SourceGenerator 使用姿势(1):生成代理类,实现简单的AOP

    SourceGenerator 已经出来很久了,也一直在关注.之前观摩大佬 xljiulang 的 WebApiClient 使用 SourceGenerator 生成接口代理类,深受启发,准备拿过来 ...

  3. MySQL5.7兼容5.6

    MySQL5.7兼容5.6配置----MySQL5.7以上版本数据库兼容MySQL5.5-5.6版本数据库 手动安装MySQL 8.0/5.7 需要修改配置兼容 ,修改后需要重启mysql服务 (建议 ...

  4. 常用内置模块os sys json

    今日内容回顾 目录 今日内容回顾 os模块 sys模块 json模块 json模块实战 os模块 sys模块 json模块 os模块 os模块主要与代码运行的操作系统打交道 1.创建目录(文件夹) i ...

  5. uniapp input框聚焦时软键盘弹起整个页面上滑,固定页面不让上滑问题

    根据需求,软键盘弹起时,不允许页面整体向上滑动 用到的属性是:  :adjust-position="false" uni-app 软键盘顶起底部fixed定位的输入框 页面就不会 ...

  6. day09-功能实现08

    家居网购项目实现08 以下皆为部分代码,详见 https://github.com/liyuelian/furniture_mall.git 19.功能18-添加家居到购物车 19.1需求分析/图解 ...

  7. [OpenCV实战]39 在OpenCV中使用ArUco标记的增强现实

    文章目录 1 什么是ArUco标记? 2 在OpenCV中生成ArUco标记 3 检测Aruco标记 4 增强现实应用 5 总结和代码 5.1 生成aruco标记 5.2 使用aruco增强现实 6 ...

  8. 基于Spark的均值漂移算法在网络舆情聚类中的应用

    知网链接 原文链接 张京坤,  王怡怡 软件导刊   2020年19卷第9期 页码:190-195 DOI:10.11907/rjdk.192529 出版日期:2020-9-15 摘 要: 为了改善网 ...

  9. 07.synchronized都问啥?

    大家好,我是王有志.关注王有志,一起聊技术,聊游戏,从北漂生活谈到国际风云.最近搞了个抽奖送书的活动,欢迎点击链接参与. 如果Java面试有什么是必问的,synchronized必定占据一席之地.初出 ...

  10. C#开发的插件程序 - 开源研究系列文章

    上次编写了一个家庭小助手的小工具软件,也对其中的线程池及管理器进行了介绍(见博文:C#开发的线程池和管理器 - 开源研究系列文章),这次把里面的插件部分的功能单独放出来进行介绍,让更多的朋友能够进行学 ...