spring给容器中注入组件的几种方式

目录

  1. 环境搭建

<!-- 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给容器中注入组件

1.包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)适用于把自己写的类加入组件(默认ID类名首字母小写)

此种方式比较简单就不贴代码了

2.@Bean[导入的第三方包里面的组件] (注意一定要在这个配置类上加上@Configuration)

//    @Scope指定作用域
//    prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。
//            每次获取的时候才会调用方法创建对象;
//    singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。
//            以后每次获取就是直接从容器(map.get())中拿,
//   request:同一次请求创建一个实例
//	 session:同一个session创建一个实例
    @Scope("prototype")
    @Lazy  //懒加载   spring 默认是容器启动的时候创建对象  加上这个注解之后 创建容器时不会创建对象   只有在用到这个对象的时候才会创建
    @Bean    //给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id  可以@Bean("xxxx")指定id
    public Test1 test1Bbaen(){
        return new Test1();
    }

3.@Import[快速给容器中导入一个组件]

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

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

}
	在配置类中
        @Bean
	public ColorFactoryBean colorFactoryBean(){
		return new ColorFactoryBean();
	}

 

 

----摘抄鲁班学院

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值