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. 1.8 微信推送早安及天气预报信息(Springboot框架)(二)

    微信推送早安及天气预报信息(搭建框架和代码完善) 目录 一.搭建框架 1. 环境准备 2. 搭建Springboot框架 二.获取代码并完善 1. pom.xml 2. application.yml ...

  2. spring框架学习(一):Bean的装配方式 ——基于注解的装配、自动装配

    Bean的装配方式 基于注解装配 常用注解: 总结 自动装配 [序言] 在前面的例子中我们就可以看到了使用基于XML方式的缺点了:如果应用中有较多的Bean对象,则会导致xml文件过于臃肿,给后续的维 ...

  3. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

  4. Springboot源码分析第一弹 - 自动装配实现

    Springboot就不用多了吧,解放Java开发双手的神器. 最显著的特点就是,去配置化,自动装配,自动配置.让开发人员只需要注重业务的开发 今天就来了解一下自动装配的源码是怎么实现的 预先准备 直 ...

  5. SpringBoot:认认真真梳理一遍自动装配原理

    目录 前言 SpringBoot介绍 SpringBoot所具备的特征有: 自己的理解: 开箱即用原理 体验开箱即用 开箱即用原理剖析 对比SSM配置 从pom.xml开始 所以我们可以得出第一个结论 ...

  6. Spring(3)——装配 Spring Bean 详解

    装配 Bean 的概述 前面已经介绍了 Spring IoC 的理念和设计,这一篇文章将介绍的是如何将自己开发的 Bean 装配到 Spring IoC 容器中. 大部分场景下,我们都会使用 Appl ...

  7. 2.3 Bean装配

    1.Spring容器成功启动的条件 Spring框架的类包都已放在应用程序的类路径: 应用程序为Spring提供完备的Bean信息: Bean的类都已放到应用程序的类路径下. 2.Bean配置信息是B ...

  8. Spring framework(4):IoC (2) Bean 装配

    Spring 装配 Bean 概述 Spring 容器启动的3个条件: Spring 本身:Spring 框架的类包都已经放置在应用程序的类路径下: Bean 配置信息:应用程序为 Spring 提供 ...

  9. Spring Bean 装配和依赖注入

    Spring IOC 容器的依赖注入工作可以分为两个阶段.第一个阶段可以认为是构建和收集 Bean 定义的阶段,在这个阶段中,我们可以通过 xml 或者 Java 代码的方式定义一些 Bean,然后通 ...

最新文章

  1. Typora链接跳转,页内和页外
  2. X86服务器虚拟化的资源划分和性能优化
  3. 架构师究竟要不要写代码?
  4. mysql 慢查询 定位过程,和order by有关
  5. Windows 路由追踪tracert命令使用示例
  6. 少儿编程100讲轻松学python(四)-python如何判断是否为数字字符串
  7. 山东专升本access知识点_全国各省份每年的专升本考试大纲啥时候公布?考纲公布之前你该做什么?...
  8. MySQL笔记(七)数据库三范式
  9. SpellGCN: Incorporating Phonological and Visual Similarities intoLanguage Models
  10. 麦克纳姆轮全向移动机器人运动效率分析
  11. 记录一下树莓派开机启动失败 进入紧急模式 原因
  12. 如何用Java写QQ机器人 v2.0
  13. ubuntu 12.04下Trackpoint 小红点灵敏度和速度调整
  14. 翻译题9寒假1周赛题
  15. arcgis更改默认路径
  16. 科学计算机怎么计算e的指数,关于e的公式换算(e的指数运算公式大全)
  17. TCP offload to the resuce 让TCP减负来挽救我们
  18. 拆解1968年的美国军用电脑,真的怀疑是“穿越”啊!
  19. 车规电阻AEC-Q200测试项目及元器件检测设备
  20. python的撤销和回退_撤销和回退

热门文章

  1. Android NDK开发之旅14 JNI 缓存策略
  2. npm package.json那些事
  3. Linux 下判断Server 内存是否不足
  4. 实验8-SPSS交叉表分析
  5. ACM 配置中心实战:Spring + MyBatis + Druid + ACM
  6. python:爬虫初体验
  7. 交换机定时自动备份配置文件的方法
  8. nodejs之express -- 1
  9. Linux服务器内核参数优化
  10. jQuery中DOM操作