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

目錄

  1. 環境搭建
<code>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-context/<artifactid>
<version>5.1.5.RELEASE/<version>
/<dependency>/<code>

spring給容器中注入組件

1.包掃描+組件標註註解(@Controller/@Service/@Repository/@Component)適用於把自己寫的類加入組件(默認ID類名首字母小寫)

此種方式比較簡單就不貼代碼了

2.@Bean[導入的第三方包裡面的組件] (注意一定要在這個配置類上加上@Configuration)

<code>//    @Scope指定作用域
// prototype:多實例的:ioc容器啟動並不會去調用方法創建對象放在容器中。
// 每次獲取的時候才會調用方法創建對象;
// singleton:單實例的(默認值):ioc容器啟動會調用方法創建對象放到ioc容器中。
// 以後每次獲取就是直接從容器(map.get())中拿,
// request:同一次請求創建一個實例
//\t session:同一個session創建一個實例
@Scope("prototype")
@Lazy //懶加載 spring 默認是容器啟動的時候創建對象 加上這個註解之後 創建容器時不會創建對象 只有在用到這個對象的時候才會創建

@Bean //給容器中註冊一個Bean;類型為返回值的類型,id默認是用方法名作為id 可以@Bean("xxxx")指定id
public Test1 test1Bbaen(){
return new Test1();
}/<code>

3.@Import[快速給容器中導入一個組件]

<code>@Configuration
@ComponentScan("com.tjx")
@Import({Test1.class, Test1Mapper.class}) //默認已該類的全類名作為id
public class MainConfig {


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


如下
@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 {

\t/**
\t * AnnotationMetadata:當前類的註解信息
\t * BeanDefinitionRegistry:BeanDefinition註冊類;
\t * \t\t把所有需要添加到容器中的bean;調用
\t * \t\tBeanDefinitionRegistry.registerBeanDefinition手工註冊進來
\t */
\t@Override
\tpublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
\t\t
\t\tboolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red");
\t\tboolean definition2 = registry.containsBeanDefinition("com.atguigu.bean.Blue");
\t\tif(definition && definition2){
\t\t\t//指定Bean定義信息;(Bean的類型,Bean。。。)
\t\t\tRootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
\t\t\t//註冊一個Bean,指定bean名
\t\t\tregistry.registerBeanDefinition("rainBow", beanDefinition);
\t\t}
\t}

}

/<code>

4.使用Spring提供的 FactoryBean(工廠Bean);

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

<code>package com.atguigu.bean;

import org.springframework.beans.factory.FactoryBean;

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

\t//返回一個Color對象,這個對象會添加到容器中

\t@Override
\tpublic Color getObject() throws Exception {
\t\t// TODO Auto-generated method stub
\t\tSystem.out.println("ColorFactoryBean...getObject...");
\t\treturn new Color();
\t}

\t@Override
\tpublic Class> getObjectType() {
\t\t// TODO Auto-generated method stub
\t\treturn Color.class;
\t}

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

}/<color>/<code>
<code>\t在配置類中
@Bean
\tpublic ColorFactoryBean colorFactoryBean(){
\t\treturn new ColorFactoryBean();
\t}/<code>


分享到:


相關文章: