spring-注解---IOC(3)
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)相关推荐
- Spring(二)、注解IOC
一.Spring 的 IOC 的注解开发 1.1.Spring 的 IOC 的注解开发入门 Hibernate 和 Struts 框架也有注解开发,但在实际开发过程中应用不是很多. 1.1.1.创建 ...
- 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 创建数 ...
- 【Spring】IOC:基于注解的IOC容器初始化源码分析
从 Spring2.0 以后的版本中,Spring 也引入了基于注解(Annotation)方式的配置,注解(Annotation)是 JDK1.5 中引入的一个新特性,用于简化 Bean 的配置,可 ...
- 【Spring系列】 Spring注解方式实现IOC、DI及其Spring其他注解
文章目录 注解回顾 JDK内置注解 自定义注解 1.声明一个注解类,由`@interface`修饰 2.通过元注解修饰注解的定义 `@Target`:(常用) `@Retention`:(常用) `@ ...
- Spring 常用注解(IOC/AOP/MVC)
① 注解 和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作. 本质上:所有一切的操作都是 ...
- Spring常用注解,注解 IOC ,AOP,MVC 的理解
文章目录 大佬总结 0.Spring常用注解 0.1.SpringBootController里面的用法 0.1.1.SpringBoot 中常用注解@Controller/@RestControll ...
- Spring中IOC注解开发;xml中常用字符转译
目录 1.Spring注解主要用来替xml配置文件: 2.xml中特殊符号转译: 1.Spring注解主要用来替xml配置文件: /*spring原始注解主要代替<Bean>的配置 * * ...
- Spring 实践 -IoC
Spring 实践 标签: Java与设计模式 Spring简介 Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转) ...
- java spring框架 注解_史上最全的java spring注解
史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...
- 使用 spring 的 IOC 解决程序耦合——获取spring的Ioc核心容器,并根据id获取对象、核心容器的两个接口(ApplicationContext、BeanFactory)引发出的问题
IOC概念和spring中的IOC 明确 ioc 的作用: 削减计算机程序的耦合(解除我们代码中的依赖关系). 使用 spring 的 IOC 解决程序耦合 获取spring的Ioc核心容器,并根据i ...
最新文章
- 解决WinCE自动挂起的问题
- 纯干货-多场景下大屏可视化应用(文中含可视化源代码链接)
- 【NLP】Transformer自注意机制代码实现
- C++longest increasing subsequence 最长递增子序列的实现之一(附完整源码)
- 【Floyed】【匈牙利算法】导弹(jzoj 1610)
- 深度学习之卷积神经网络 ResNet
- TCP/IP 协议栈 -- 编写UDP客户端注意细节
- 认识阿里云的产品逻辑:基础设施必须必业务跑得快
- npm的常用配置项---npm工作笔记004
- 加密 数字_数字卢布不会具有BTC这样的加密资产的优势
- ROST情感分析的语法规则_从词法分析角度聊 Go 代码组成
- 如何批量重命名,文件批量重命名方法介绍
- 苹果电脑关于命令行的操作
- 链家租房数据基本分析
- 为什么这么多人会选择单页设计?
- FFmpeg入门详解之114:DirectShow读取摄像头数据
- 鸿蒙手机隐藏应用,手机里羞羞的App ,终于可以一键藏起来了!
- 成功在虚拟机里面安装MAC苹果系统
- 从浏览器沦为系统毒瘤:无法禁用的IE背后,是几百亿的家族生意。。。
- 【springboot maven 本地包依赖】