spring--注解---IOC(3)

package com.zwj.bean;public class Blue {public Blue(){System.out.println("blue...constructor");}public void init(){System.out.println("blue...init...");}public void detory(){System.out.println("blue...detory...");}
}

Blue

package com.zwj.bean;import org.springframework.stereotype.Component;@Component
public class Car {public Car(){System.out.println("car constructor...");}public void init(){System.out.println("car ... init...");}public void detory(){System.out.println("car ... detory...");}}

Car

package com.zwj.bean;public class Color {private Car car;public Car getCar() {return car;}public void setCar(Car car) {this.car = car;}@Overridepublic String toString() {return "Color [car=" + car + "]";}}

Color

package com.zwj.bean;import org.springframework.beans.factory.FactoryBean;//创建一个Spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {//返回一个Color对象,这个对象会添加到容器中
    @Overridepublic Color getObject() throws Exception {// TODO Auto-generated method stubSystem.out.println("ColorFactoryBean...getObject...");return new Color();}@Overridepublic Class<?> getObjectType() {// TODO Auto-generated method stubreturn Color.class;}//是单例?//true:这个bean是单实例,在容器中保存一份//false:多实例,每次获取都会创建一个新的bean;
    @Overridepublic boolean isSingleton() {// TODO Auto-generated method stubreturn false;}}

ColorFactoryBean

package com.zwj.bean;public class RainBow {}

RainBow

package com.zwj.bean;public class Yellow {}

Yellow

package com.zwj.condition;import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;import com.zwj.bean.RainBow;public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {/*** AnnotationMetadata:当前类的注解信息* BeanDefinitionRegistry:BeanDefinition注册类;*         把所有需要添加到容器中的bean;调用*         BeanDefinitionRegistry.registerBeanDefinition手工注册进来*/@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {boolean definition = registry.containsBeanDefinition("com.zwj.bean.Yellow");boolean definition2 = registry.containsBeanDefinition("com.zwj.bean.Blue");if(definition && definition2){//指定Bean定义信息;(Bean的类型,Bean。。。)RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);//注册一个Bean,指定bean名registry.registerBeanDefinition("rainBow", beanDefinition);}}}

MyImportBeanDefinitionRegistrar

package com.zwj.condition;import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector {//返回值,就是到导入到容器中的组件全类名//AnnotationMetadata:当前标注@Import注解的类的所有注解信息
    @Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {// TODO Auto-generated method stub//importingClassMetadata//方法不要返回null值return new String[]{"com.zwj.bean.Blue","com.zwj.bean.Yellow"};}}

MyImportSelector

package com.zwj.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;import com.zwj.bean.Car;
import com.zwj.bean.Color;
import com.zwj.bean.ColorFactoryBean;
import com.zwj.condition.MyImportBeanDefinitionRegistrar;
import com.zwj.condition.MyImportSelector;@Configuration
@Import({Car.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
//@Import导入组件,id默认是组件的全类名
public class MainConfig2 {/*** 给容器中注册组件;* 1)、包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类]* 2)、@Bean[导入的第三方包里面的组件]* 3)、@Import[快速给容器中导入一个组件]*         1)、@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名*         2)、ImportSelector:返回需要导入的组件的全类名数组;*         3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中* 4)、使用Spring提供的 FactoryBean(工厂Bean);*         1)、默认获取到的是工厂bean调用getObject创建的对象*         2)、要获取工厂Bean本身,我们需要给id前面加一个&*             &colorFactoryBean*/@Beanpublic ColorFactoryBean colorFactoryBean(){return new ColorFactoryBean();}}

MainConfig2

package com.zwj.test;import static org.junit.Assert.*;import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import com.zwj.bean.Blue;
import com.zwj.config.MainConfig2;public class IOCTest {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);@Testpublic void testImport(){printBeans(applicationContext);Blue bean = (Blue) applicationContext.getBean(Blue.class);System.out.println(bean);//工厂Bean获取的是调用getObject创建的对象Object bean2 = applicationContext.getBean("colorFactoryBean");Object bean3 = applicationContext.getBean("colorFactoryBean");System.out.println("bean的类型:"+bean2.getClass());System.out.println(bean2 == bean3);Object bean4 = applicationContext.getBean("&colorFactoryBean");System.out.println(bean4.getClass());}private void printBeans(AnnotationConfigApplicationContext applicationContext){String[] definitionNames = applicationContext.getBeanDefinitionNames();for (String name : definitionNames) {System.out.println(name);}}}/*mainConfig2
com.zwj.bean.Car
com.zwj.bean.Blue
com.zwj.bean.Yellow
colorFactoryBean
rainBow
com.zwj.bean.Blue@341b80b2
ColorFactoryBean...getObject...
ColorFactoryBean...getObject...
bean的类型:class com.zwj.bean.Color
false
class com.zwj.bean.ColorFactoryBean*/

IOCTest

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zwj</groupId><artifactId>spring-annotation_IOC</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.12.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/junit/junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>
</project>

pom.xml

转载于:https://www.cnblogs.com/ou-pc/p/9860691.html

spring-注解---IOC(3)相关推荐

  1. Spring(二)、注解IOC

    一.Spring 的 IOC 的注解开发 1.1.Spring 的 IOC 的注解开发入门 Hibernate 和 Struts 框架也有注解开发,但在实际开发过程中应用不是很多. 1.1.1.创建 ...

  2. java day58【 案例:使用 spring 的 IoC 的实现账户的 CRUD 、 基于注解的 IOC 配置 、 Spring 整合 Junit[掌握] 】...

    第1章 案例:使用 spring 的 IoC 的实现账户的 CRUD 1.1 需求和技术要求 1.1.1 需求 1.1.2 技术要求 1.2 环境搭建 1.2.1 拷贝 jar 包 1.2.2 创建数 ...

  3. 【Spring】IOC:基于注解的IOC容器初始化源码分析

    从 Spring2.0 以后的版本中,Spring 也引入了基于注解(Annotation)方式的配置,注解(Annotation)是 JDK1.5 中引入的一个新特性,用于简化 Bean 的配置,可 ...

  4. 【Spring系列】 Spring注解方式实现IOC、DI及其Spring其他注解

    文章目录 注解回顾 JDK内置注解 自定义注解 1.声明一个注解类,由`@interface`修饰 2.通过元注解修饰注解的定义 `@Target`:(常用) `@Retention`:(常用) `@ ...

  5. Spring 常用注解(IOC/AOP/MVC)

    ① 注解 和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作. 本质上:所有一切的操作都是 ...

  6. Spring常用注解,注解 IOC ,AOP,MVC 的理解

    文章目录 大佬总结 0.Spring常用注解 0.1.SpringBootController里面的用法 0.1.1.SpringBoot 中常用注解@Controller/@RestControll ...

  7. Spring中IOC注解开发;xml中常用字符转译

    目录 1.Spring注解主要用来替xml配置文件: 2.xml中特殊符号转译: 1.Spring注解主要用来替xml配置文件: /*spring原始注解主要代替<Bean>的配置 * * ...

  8. Spring 实践 -IoC

    Spring 实践 标签: Java与设计模式 Spring简介 Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转) ...

  9. java spring框架 注解_史上最全的java spring注解

    史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...

  10. 使用 spring 的 IOC 解决程序耦合——获取spring的Ioc核心容器,并根据id获取对象、核心容器的两个接口(ApplicationContext、BeanFactory)引发出的问题

    IOC概念和spring中的IOC 明确 ioc 的作用: 削减计算机程序的耦合(解除我们代码中的依赖关系). 使用 spring 的 IOC 解决程序耦合 获取spring的Ioc核心容器,并根据i ...

最新文章

  1. 解决WinCE自动挂起的问题
  2. 纯干货-多场景下大屏可视化应用(文中含可视化源代码链接)
  3. 【NLP】Transformer自注意机制代码实现
  4. C++longest increasing subsequence 最长递增子序列的实现之一(附完整源码)
  5. 【Floyed】【匈牙利算法】导弹(jzoj 1610)
  6. 深度学习之卷积神经网络 ResNet
  7. TCP/IP 协议栈 -- 编写UDP客户端注意细节
  8. 认识阿里云的产品逻辑:基础设施必须必业务跑得快
  9. npm的常用配置项---npm工作笔记004
  10. 加密 数字_数字卢布不会具有BTC这样的加密资产的优势
  11. ROST情感分析的语法规则_从词法分析角度聊 Go 代码组成
  12. 如何批量重命名,文件批量重命名方法介绍
  13. 苹果电脑关于命令行的操作
  14. 链家租房数据基本分析
  15. 为什么这么多人会选择单页设计?
  16. FFmpeg入门详解之114:DirectShow读取摄像头数据
  17. 鸿蒙手机隐藏应用,手机里羞羞的App ,终于可以一键藏起来了!
  18. 成功在虚拟机里面安装MAC苹果系统
  19. 从浏览器沦为系统毒瘤:无法禁用的IE背后,是几百亿的家族生意。。。
  20. 【springboot maven 本地包依赖】

热门文章

  1. Cutting Bamboos(牛客多校第九场H主席树+二分+思维)
  2. 威佐夫博弈(模板题)
  3. mysql创建表格时候数据格式_mysql建表语句和数据类型
  4. python统计分析 --- 1.方差分析、t检验
  5. DOS命令行数据乱码解决
  6. linux下启动solr命令,如何自动启动Solr?
  7. 图论--2-SAT--poj 3678-Katu Puzzle(模板题)
  8. Java NIO原理和使用
  9. busybox tftp
  10. 嵌入式开发常用工具软件