Spring自动装配方式

参考链接

1. @AutoWired注解

自动注入【Spring定义的】:可以标注在构造器,参数,方法,属性

1)、默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);找到就赋值
2)、如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
               applicationContext.getBean("bookDao")
3)、@Qualifier("bookDao"):使用@Qualifier指定需要装配的组件的id,而不是使用属性名
4)、自动装配默认一定要将属性赋值好,没有就会报错;
   可以使用@Autowired(required=false);
5)、@Primary:让Spring进行自动装配的时候,默认使用首选的bean;
      也可以继续使用@Qualifier指定需要装配的bean的名字
6)、@Autowired标注的位置:构造器,参数,方法,属性;都是从容器中获取参数组件的值
    1)、[标注在方法位置]@Bean+方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配
    2)、[标在构造器上]:如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取
2.@Resourece注解

Spring还支持使用@Resource(JSR250)和@Inject(JSR330)【java规范】,@Resource不支持@Primary功能和required=false功能,@Inject支持@Primary功能,但是没有required属性,不支持required=false功能。

3.注入底层组件

自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFactory,xxx)自定义组件需要实现xxxAware接口;在创建对象的时候会调用接口规定的方法注入相关组件,把Spring底层的一些组件注入到自定义的bean中,xxxAware的功能都是使用xxxAwareProcessor处理的,判断实现了哪个Aware接口然后将bean转化为该类型调用set方法,将容器底层组件注入。

@Override	
@Nullable
	public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
		AccessControlContext acc = null;
if (System.getSecurityManager() != null &&
			(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
					bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
					bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) {
		acc = this.applicationContext.getBeanFactory().getAccessControlContext();
	}

	if (acc != null) {
		AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
			invokeAwareInterfaces(bean);
			return null;
		}, acc);
	}
	else {
		invokeAwareInterfaces(bean);
	}

	return bean;
}

private void invokeAwareInterfaces(Object bean) {
	if (bean instanceof Aware) {
		if (bean instanceof EnvironmentAware) {
			((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
		}
		if (bean instanceof EmbeddedValueResolverAware) {
			((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
		}
		if (bean instanceof ResourceLoaderAware) {
			((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
		}
		if (bean instanceof ApplicationEventPublisherAware) {
			((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
		}
		if (bean instanceof MessageSourceAware) {
			((MessageSourceAware) bean).setMessageSource(this.applicationContext);
		}
		if (bean instanceof ApplicationContextAware) {
			((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
		}
	}
}
4.@Profile注解

@Profile注解为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能
(1)加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中,默认是default环境。
(2)写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能生效
(3)没有标注环境标识的bean在任何环境下都加载
运行时如何制定环境:
(1)命令行参数,通过在虚拟机参数位置指定-Dspring.profiles.active=xxx来指定运行环境,标注了该环境的bean会被配置进容器中
(2)程序内指定:创建一个applicationContext ——》设置需要激活的环境,applicationContext.getEnvironment().setActiveProfiles(“”) ——》注册主配置类,applicationContext.register(xxx.class) ——》启动刷新容器,applicationContext.refresh();

5.@AllArgsConstructor注解

@AllArgsConstructor注解也可以注入对应的bean

Springboot官方建议使用final来修饰成员变最,然后通过构造方法来进行注入原因:final修饰的成员变量是不能够被修改的,反射那就没办法了
在这里插入图片描述
和下面代码一样:
在这里插入图片描述

6.@RequiredArgsConstructor注解

@RequiredArgsConstructor写在类上面可以替换@Autowired注解,需要注意的是在注入时需要使用final定义,或者使用@Notnull注解

@Slf4j
@RestController
//生成一个包含过所有字段的构造方法
//@AllArgsConstructor
//会将类的每一个final字段或者non-null字段生成一个构造方法 
@RequiredArgsConstructor
public class AdminUserController {
    /* autowired没什么问题,但是有可能报错,iUserService为null,spring也不建议使用autowired */
    //@Autowired
    //private IUserService iUserService;    
    private final IUserService iUserService;    
    @PostMapping("/login")
    public Result adminLogin(HttpServletResponse response, String username,String password) {
        //....
    }
}

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhou22-codeWalker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值