SpringBoot框架(4)-- 类装配及Bean装配监听器
1、普通方式装配类对象
(1)添加带有@Bean注解的方法
User.java(带@Component注解)
1 package com.demo.boot.bootenable.beanDemo1; 2 3 import org.springframework.stereotype.Component; 4 5 @Component 6 public class User { 7 }
User.java
(2)需要装配的类添加@Component注解
Book.java(不带@Component注解)
1 package com.demo.boot.bootenable.beanDemo1; 2 3 public class Book { 4 }
Book.java
==》打印
1 package com.demo.boot.bootenable.beanDemo1; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.context.ConfigurableApplicationContext; 6 import org.springframework.context.annotation.Bean; 7 8 /** 9 * 普通方式装配类对象 10 * (1)添加带有@Bean注解的方法 11 * (2)需要装配的类添加@Component注解 12 */ 13 @SpringBootApplication 14 public class BootEnableApplication { 15 16 @Bean 17 public Book createBook(){ 18 return new Book(); 19 } 20 21 public static void main(String[] args) { 22 ConfigurableApplicationContext context = SpringApplication.run(com.demo.boot.bootenable.beanDemo1.BootEnableApplication.class); 23 User user = context.getBean(User.class); 24 System.out.println(user); 25 26 Book book = context.getBean(Book.class); 27 System.out.println(book); 28 context.close(); 29 } 30 }
main方法
com.demo.boot.bootenable.beanDemo1.User@3301500b
com.demo.boot.bootenable.beanDemo1.Book@24b52d3e
2、使用@Import方式装配类对象
准备两个测试类User.java和Book.java
1 package com.demo.boot.bootenable.beanDemo2; 2 3 public class User { 4 }
User.java
1 package com.demo.boot.bootenable.beanDemo2; 2 3 public class Book { 4 }
Book.java
(1)方式1==》@Import({User.class,Book.class}) //直接添加需要装配的类
==》代码结构
1 package com.demo.boot.bootenable.beanDemo2; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.context.ConfigurableApplicationContext; 6 import org.springframework.context.annotation.Import; 7 8 /** 9 * 使用@Import方式装配类对象 10 */ 11 @SpringBootApplication 12 @Import({User.class,Book.class})//方式1==》直接添加需要装配的类 13 public class BootEnableApplication { 14 public static void main(String[] args) { 15 ConfigurableApplicationContext context2 = SpringApplication.run(BootEnableApplication.class); 16 User user = context2.getBean(User.class); 17 System.out.println(user); 18 19 Book book = context2.getBean(Book.class); 20 System.out.println(book); 21 context2.close(); 22 } 23 }
Application.java
==》输出
com.demo.boot.bootenable.beanDemo2.User@24855019
com.demo.boot.bootenable.beanDemo2.Book@3abd581e
(2)方式2==》@Import(BeanImportSelector.class) //BeanImportSelector重写ImportSelector类的selectImport方法
==》代码结构
1 package com.demo.boot.bootenable.beanDemo2; 2 3 import org.springframework.context.annotation.ImportSelector; 4 import org.springframework.core.type.AnnotationMetadata; 5 6 public class BeanImportSelector implements ImportSelector { 7 @Override 8 public String[] selectImports(AnnotationMetadata annotationMetadata) { 9 return new String[]{ 10 "com.demo.boot.bootenable.beanDemo2.Book", 11 "com.demo.boot.bootenable.beanDemo2.User" 12 }; 13 } 14 }
BeanImportSelector.java
1 package com.demo.boot.bootenable.beanDemo2; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.context.ConfigurableApplicationContext; 6 import org.springframework.context.annotation.Import; 7 8 /** 9 * 使用@Import方式装配类对象 10 */ 11 @SpringBootApplication 12 //@Import({User.class,Book.class})//方式1==》直接添加需要装配的类 13 @Import(BeanImportSelector.class)//方式2==》BeanImportSelector重写ImportSelector类的selectImport方法 14 public class BootEnableApplication { 15 public static void main(String[] args) { 16 ConfigurableApplicationContext context2 = SpringApplication.run(BootEnableApplication.class); 17 User user = context2.getBean(User.class); 18 System.out.println(user); 19 20 Book book = context2.getBean(Book.class); 21 System.out.println(book); 22 context2.close(); 23 } 24 }
Application.java
==》输出
com.demo.boot.bootenable.beanDemo2.User@88d6f9b
com.demo.boot.bootenable.beanDemo2.Book@47d93e0d
(3)方式3==》@Import(MyBeanDefinitionRegistrar.class) //MyBeanDefinitionRegistrar重写ImportBeanDefinitionRegistrar类的registerBeanDefinitions方法
==》代码结构
1 package com.demo.boot.bootenable.beanDemo3; 2 3 import org.springframework.beans.factory.config.BeanDefinition; 4 import org.springframework.beans.factory.support.BeanDefinitionBuilder; 5 import org.springframework.beans.factory.support.BeanDefinitionRegistry; 6 import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; 7 import org.springframework.core.type.AnnotationMetadata; 8 9 /** 10 * ImportBeanDefinitionRegistrar可以为装配对象添加额外的属性 11 */ 12 public class MyBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { 13 @Override 14 public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { 15 BeanDefinitionBuilder userBDB = BeanDefinitionBuilder.rootBeanDefinition(User.class); 16 BeanDefinition userBD = userBDB.getBeanDefinition(); 17 beanDefinitionRegistry.registerBeanDefinition("user",userBD); 18 19 BeanDefinitionBuilder bookBDB = BeanDefinitionBuilder.rootBeanDefinition(Book.class); 20 BeanDefinition bookBD = bookBDB.getBeanDefinition(); 21 beanDefinitionRegistry.registerBeanDefinition("book",bookBD); 22 } 23 }
MyBeanDefinitionRegistrar.java
1 package com.demo.boot.bootenable.beanDemo3; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.context.ConfigurableApplicationContext; 6 import org.springframework.context.annotation.Import; 7 8 /** 9 * 使用@Import方式装配类对象 10 */ 11 @SpringBootApplication 12 //@Import({User.class,Book.class})//方式1==》直接添加需要装配的类 13 //@Import(BeanImportSelector.class)//方式2==》BeanImportSelector重写ImportSelector类的selectImport方法 14 @Import(MyBeanDefinitionRegistrar.class)//方式3==》MyBeanDefinitionRegistrar重写ImportBeanDefinitionRegistrar类的registerBeanDefinitions方法 15 public class BootEnableApplication { 16 public static void main(String[] args) { 17 ConfigurableApplicationContext context3 = SpringApplication.run(BootEnableApplication.class); 18 User user = context3.getBean("user", User.class); 19 System.out.println(user); 20 21 Book book = context3.getBean("book", Book.class); 22 System.out.println(book); 23 context3.close(); 24 } 25 }
Application.java
==》输出
com.demo.boot.bootenable.beanDemo3.User@4d0402b
com.demo.boot.bootenable.beanDemo3.Book@2fa7ae9
备注:以上demo中,都是指定需要装配的类,不指定则不会自动自动装配
3、Bean装配监听器
bean在装配过程中会执行一系列方法,其中有postProcessBeforeInitialization --> afterPropertiesSet --> init-method -- > postProcessAfterInitialization。
(1)postProcessBeforeInitialization方法,在bean初始化之前执行
(2)afterPropertiesSet方法,初始化bean的时候执行
(3)nit-method方法,初始化bean的时候执行
(4)postProcessAfterInitialization方法,在bean初始化之后执行。
因此,我们可以在装配时,进行拦截处理。这里demo选用重写postProcessBeforeInitialization方法
代码结构
3.1 创建类 MyBeanDefinitionProcessor继承BeanPostProcessor,添加属性packages的构造器,并重写postProcessBeforeInitialization方法,实现类装配前打印。
1 package com.demo.boot.bootenable.smple; 2 3 import org.springframework.beans.BeansException; 4 import org.springframework.beans.factory.config.BeanPostProcessor; 5 6 import java.util.ArrayList; 7 8 public class MyBeanDefinitionProcessor implements BeanPostProcessor { 9 10 private ArrayList<String> packages; 11 12 public ArrayList<String> getPackages() { 13 return packages; 14 } 15 16 public void setPackages(ArrayList<String> packages) { 17 this.packages = packages; 18 } 19 20 @Override 21 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 22 23 for (String pack : packages) { 24 if (bean.getClass().getName().startsWith(pack)) { 25 System.out.println("instance name:" + bean.getClass().getName()); 26 } 27 } 28 return bean; 29 } 30 }
MyBeanDefinitionProcessor
3.2 创建类ScannerPackegeRegistar implements ImportBeanDefinitionRegistrar,重写registerBeanDefinitions方法,把自定义的MyBeanDefinitionProcessor注册进去。
1 package com.demo.boot.bootenable.smple; 2 3 import org.springframework.beans.factory.support.BeanDefinitionBuilder; 4 import org.springframework.beans.factory.support.BeanDefinitionRegistry; 5 import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; 6 import org.springframework.core.type.AnnotationMetadata; 7 import org.springframework.stereotype.Component; 8 9 import java.util.Arrays; 10 import java.util.List; 11 12 @Component 13 public class ScannerPackegeRegistar implements ImportBeanDefinitionRegistrar { 14 /** 15 * 注册实体对象被装配前回调方法 16 * @param annotationMetadata 17 * @param beanDefinitionRegistry 18 */ 19 @Override 20 public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { 21 String[] strArr = (String[]) annotationMetadata 22 .getAnnotationAttributes(EnableScanner.class.getName()) 23 .get("packages"); 24 25 List<String> packages = Arrays.asList(strArr); 26 System.out.println(packages); 27 BeanDefinitionBuilder dbd = BeanDefinitionBuilder.rootBeanDefinition(MyBeanDefinitionProcessor.class); 28 dbd.addPropertyValue("packages", packages); 29 30 beanDefinitionRegistry.registerBeanDefinition(MyBeanDefinitionProcessor.class.getName(), dbd.getBeanDefinition()); 31 } 32 33 }
ScannerPackegeRegistar.java
3.3 自定义注解EnableScanner
1 package com.demo.boot.bootenable.smple; 2 3 import org.springframework.context.annotation.Import; 4 import java.lang.annotation.*; 5 6 @Target({ElementType.TYPE}) 7 @Retention(RetentionPolicy.RUNTIME) 8 @Documented 9 @Import(ScannerPackegeRegistar.class) 10 public @interface EnableScanner { 11 String[] packages(); 12 }
EnableScanner.java
3.4 创建Person.java、Student.java和UserVO.java类
1 package com.demo.boot.bootenable.smple.bean; 2 3 import org.springframework.stereotype.Component; 4 5 @Component 6 public class Person { 7 }
Person.java
1 package com.demo.boot.bootenable.smple.bean; 2 3 import org.springframework.stereotype.Component; 4 5 @Component 6 public class Student { 7 }
Student.java
1 package com.demo.boot.bootenable.smple.vo; 2 3 import org.springframework.stereotype.Component; 4 5 @Component 6 public class UserVO { 7 }
UserVO.java
3.5 Application
1 package com.demo.boot.bootenable.smple; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.context.ConfigurableApplicationContext; 6 7 @SpringBootApplication 8 @EnableScanner(packages = {"com.demo.boot.bootenable.smple.bean", "com.demo.boot.bootenable.smple.vo"})//启用监控扫描类的注解 9 public class ScannerPackegeApplication { 10 public static void main(String[] args) { 11 ConfigurableApplicationContext context = SpringApplication.run(ScannerPackegeApplication.class, args); 12 13 context.close(); 14 } 15 }
Application.java
输出结果
instance name:com.demo.boot.bootenable.smple.bean.Person
instance name:com.demo.boot.bootenable.smple.bean.Student
instance name:com.demo.boot.bootenable.smple.vo.UserVO
总结思路
1、把类装配到SpringBoot容器管理主要分两大类
(1)普通方式:直接在类上加@Component注解,或者在创建对象方法加上@Bean注解
(2)通过@Import注解:直接指定需要装配的类,传入
重写ImportSelector类的selectImport方法的类,
或重写ImportBeanDefinitionRegistrar类的registerBeanDefinitions方法
2、Bean装配监听器
(1)定义注解,接受需要装配类的包名
(2)创建ImportBeanDefinitionRegistrar的子类ScannerPackegeRegistar,重写registerBeanDefinitions方法,作用是把监听器注册到SpringBoot初始化Bean的过程中。
(3)创建BeanPostProcessor的子类MyBeanDefinitionProcessor,重写postProcessBeforeInitialization方法,作用是监听在bean初始化前装配的类。
转载于:https://www.cnblogs.com/lfhappy/p/10939015.html
SpringBoot框架(4)-- 类装配及Bean装配监听器相关推荐
- 1.8 微信推送早安及天气预报信息(Springboot框架)(二)
微信推送早安及天气预报信息(搭建框架和代码完善) 目录 一.搭建框架 1. 环境准备 2. 搭建Springboot框架 二.获取代码并完善 1. pom.xml 2. application.yml ...
- spring框架学习(一):Bean的装配方式 ——基于注解的装配、自动装配
Bean的装配方式 基于注解装配 常用注解: 总结 自动装配 [序言] 在前面的例子中我们就可以看到了使用基于XML方式的缺点了:如果应用中有较多的Bean对象,则会导致xml文件过于臃肿,给后续的维 ...
- SpringBoot源码分析(二)之自动装配demo
SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...
- Springboot源码分析第一弹 - 自动装配实现
Springboot就不用多了吧,解放Java开发双手的神器. 最显著的特点就是,去配置化,自动装配,自动配置.让开发人员只需要注重业务的开发 今天就来了解一下自动装配的源码是怎么实现的 预先准备 直 ...
- SpringBoot:认认真真梳理一遍自动装配原理
目录 前言 SpringBoot介绍 SpringBoot所具备的特征有: 自己的理解: 开箱即用原理 体验开箱即用 开箱即用原理剖析 对比SSM配置 从pom.xml开始 所以我们可以得出第一个结论 ...
- Spring(3)——装配 Spring Bean 详解
装配 Bean 的概述 前面已经介绍了 Spring IoC 的理念和设计,这一篇文章将介绍的是如何将自己开发的 Bean 装配到 Spring IoC 容器中. 大部分场景下,我们都会使用 Appl ...
- 2.3 Bean装配
1.Spring容器成功启动的条件 Spring框架的类包都已放在应用程序的类路径: 应用程序为Spring提供完备的Bean信息: Bean的类都已放到应用程序的类路径下. 2.Bean配置信息是B ...
- Spring framework(4):IoC (2) Bean 装配
Spring 装配 Bean 概述 Spring 容器启动的3个条件: Spring 本身:Spring 框架的类包都已经放置在应用程序的类路径下: Bean 配置信息:应用程序为 Spring 提供 ...
- Spring Bean 装配和依赖注入
Spring IOC 容器的依赖注入工作可以分为两个阶段.第一个阶段可以认为是构建和收集 Bean 定义的阶段,在这个阶段中,我们可以通过 xml 或者 Java 代码的方式定义一些 Bean,然后通 ...
最新文章
- Typora链接跳转,页内和页外
- X86服务器虚拟化的资源划分和性能优化
- 架构师究竟要不要写代码?
- mysql 慢查询 定位过程,和order by有关
- Windows 路由追踪tracert命令使用示例
- 少儿编程100讲轻松学python(四)-python如何判断是否为数字字符串
- 山东专升本access知识点_全国各省份每年的专升本考试大纲啥时候公布?考纲公布之前你该做什么?...
- MySQL笔记(七)数据库三范式
- SpellGCN: Incorporating Phonological and Visual Similarities intoLanguage Models
- 麦克纳姆轮全向移动机器人运动效率分析
- 记录一下树莓派开机启动失败 进入紧急模式 原因
- 如何用Java写QQ机器人 v2.0
- ubuntu 12.04下Trackpoint 小红点灵敏度和速度调整
- 翻译题9寒假1周赛题
- arcgis更改默认路径
- 科学计算机怎么计算e的指数,关于e的公式换算(e的指数运算公式大全)
- TCP offload to the resuce 让TCP减负来挽救我们
- 拆解1968年的美国军用电脑,真的怀疑是“穿越”啊!
- 车规电阻AEC-Q200测试项目及元器件检测设备
- python的撤销和回退_撤销和回退