spring給容器中注入組件的幾種方式

目錄

環境搭建
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>

spring給容器中注入組件br/>1.包掃描+組件標註註解(@Controller/@Service/@Repository/@Component)適用於把自己寫的類加入組件(默認ID類名首字母小寫)
此種方式比較簡單就不貼代碼了

2.@Bean[導入的第三方包裏面的組件] (注意一定要在這個配置類上加上@Configuration)
// @Scope指定作用域
// prototype:多實例的:ioc容器啓動並不會去調用方法創建對象放在容器中。
// 每次獲取的時候纔會調用方法創建對象;
// singleton:單實例的(默認值):ioc容器啓動會調用方法創建對象放到ioc容器中。
// 以後每次獲取就是直接從容器(map.get())中拿,
// request:同一次請求創建一個實例
// session:同一個session創建一個實例br/>@Scope("prototype")
@Lazy //懶加載 spring 默認是容器啓動的時候創建對象 加上這個註解之後 創建容器時不會創建對象 只有在用到這個對象的時候纔會創建
@Bean //給容器中註冊一個Bean;類型爲返回值的類型,id默認是用方法名作爲id 可以@Bean("xxxx")指定id
public Test1 test1Bbaen(){
return new Test1();
br/>}
3.@Import[快速給容器中導入一個組件]
@Configuration
br/>@ComponentScan("com.tjx")
@Import({Test1.class, Test1Mapper.class}) //默認已該類的全類名作爲id
public class MainConfig {

//========================================
//1.如果你想自定義邏輯返回需要導入的組件.可以寫一個類實現ImportSelector接口,或者ImportBeanDefinitionRegistrar接口;注意使用實現ImportSelector的方式必須在@Import導入這個類,不要使用@Component直接把這個類加到容器,這樣不會有效果,只會導入ImportSelector實現類的本身,

如下br/>@Configuration
@ComponentScan("com.tjx")
@Import({Test1.class, Test1Mapper.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class}) //默認已該類的全類名作爲id
public class MainConfig {

================================
public class MyImportSelector implements ImportSelector{

//AnnotationMetadata:當前標註@Import註解的類的所有註解信息
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
    //返回要導入到容器中的組件全類名
    return new String[]{"com.tjx.service.Test1Service","xxxxxxxxxx"};
}

}

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

/**
 * AnnotationMetadata:當前類的註解信息
 * BeanDefinitionRegistry:BeanDefinition註冊類;
 *      把所有需要添加到容器中的bean;調用
 *      BeanDefinitionRegistry.registerBeanDefinition手工註冊進來
 */
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

    boolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red");
    boolean definition2 = registry.containsBeanDefinition("com.atguigu.bean.Blue");
    if(definition && definition2){
        //指定Bean定義信息;(Bean的類型,Bean。。。)
        RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
        //註冊一個Bean,指定bean名
        registry.registerBeanDefinition("rainBow", beanDefinition);
    }
}

}

4.使用Spring提供的 FactoryBean(工廠Bean);
 1)、默認獲取到的是工廠bean調用getObject創建的對象
  2)、要獲取工廠Bean本身,我們需要給id前面加一個&
applicationContext.getBean("&colorFactoryBean");

package com.atguigu.bean;

import org.springframework.beans.factory.FactoryBean;

//創建一個Spring定義的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {

//返回一個Color對象,這個對象會添加到容器中
@Override
public Color getObject() throws Exception {
    // TODO Auto-generated method stub
    System.out.println("ColorFactoryBean...getObject...");
    return new Color();
}

@Override
public Class<?> getObjectType() {
    // TODO Auto-generated method stub
    return Color.class;
}

//是單例?
//true:這個bean是單實例,在容器中保存一份
//false:多實例,每次獲取都會創建一個新的bean;
@Override
public boolean isSingleton() {
    // TODO Auto-generated method stub
    return false;
}

}br/>在配置類中
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章