? ??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...");} }


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...");}}


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 + "]";}}


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;}}


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


package com.zwj.bean;public class 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);}}}


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"};}}


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();}}


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*/


<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>
?