Spring蜕变笔记——依赖注入/自动装配
前言
慢慢回顾一些有趣的spring知识点
首先要明确关于依赖和注入的几个概念。
一、什么是控制反转?
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
用白话文来说,就是原来创建一个对象(类),需要使用它的时候,需要自己去 new 一个,在调用其中的方法。
而控制反转,只需要你在 创建这个对象(类)的时候,就把控制权交给spring容器了,去要使用的时候不需要自己new, 而是通过注入/装配(用注解)的方式获取。
二、依赖注入与装配的关系
我们都听说过依赖注入和自动装配
依赖注入的本质就是装配,装配是依赖注入的具体行为,这就是两者的关系。
Spring从两个角度实现自动化装配
组件扫描:Spring会自动发现应用上下文中所创建的Bean
自动装配:Spring自动满足Bean之间的依赖
下面有个例子 理解一下(其中redis连接池的获取)👇👇
三、在实际使用中可得注意一下的(不生效的原因)
注意一下,在使用中一个自己new的对象中在使用自动装配是不会生效的。
可以这么理解,
要想在自己new的类里面省事儿,调用容器的装配好的实例。就只能在对应装配的类里面,获取以后用转参数的方式,在new的时候,当作参数传过去使用。除此之外,也还可以使用静态放方法的直接调用。
用获取上下文方式获取Bean实例将方法设置为静态方法。
下面是静态方法的一个例子:
@Bean
public List<String> getMapServerNameAdress() {
return mapServerNameAdress;
}
public static List<String> getOriServerNameBean()
{
return (List<String>) SAContextHolder.getSpringBean("getOriServerName");
}
根据名称获取方法的方法
@Component
public class SAContextHolder implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
SAContextHolder.context = context;
}
public static Object getSpringBean(String beanName) {
return context == null ? null : context.getBean(beanName);
}
public static String[] getBeanDefinitionNames() {
return context.getBeanDefinitionNames();
}
}
四、了解一下常见的注解吧
常用的一些注解咱可不能忘!!
了解注解之前,得先知道Bean
Bean是啥呢
-
1、Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性(即实例化);
-
2、凡是有方法或属性的类都需要实例化,这样才能具象化去使用这些方法和属性;
-
3、规律:凡是子类及带有方法或属性的类都要加上注册Bean到Spring IoC的注解;
-
4、把Bean理解为类的代理或代言人(实际上确实是通过反射、代理来实现的),这样它就能代表类拥有该拥有的东西了
-
5、我们都在微博上@过某某,对方会优先看到这条信息,并给你反馈,那么在Spring中,你标识一个@符号,那么Spring就会来看看,并且从这里拿到一个Bean或者给出一个Bean
注解
分个类吧
注解分为两类:
1、一类是使用Bean,即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如
获取Bean的方式:
@Autowired(可以通过byTYPE)
@Resource(byNAME)
2、一类是注册Bean
@Component
@Repository
@Controller
@Service
@Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,
等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,
把对象、属性、方法完美组装。
常见的功能注解
注解 | 作用 |
---|---|
@Component | 表明该类为组件类,并告知Spring要为这个类创建Bean |
@ComponentScan | 启用了组件扫描(默认不启用),在需要装配其他类的类中添加该注解。这个默认扫描与配置类相同的包。 |
@Component(“xxxname”)/@Name(“xxxname”) | 为组件扫描的Bean命名,为beanId |
@ComponentScan(“xxxpack”)、@ComponentScan(basePackages={“xxxpack1”,“xxxpack2”}) | 设置基础包,代码启动扫描组件需要扫描那些包中带@Component注解的类。基础包的设置是不安全的,假如重构会是包结构变化,还有一种直接指定类或者接口进行扫描的方式@ComponentScan(basePackagesClasses={“xxxclass1”,“xxxclass2”}) |
@Autowried(@Inject、@Named) | 声明需要进行自动装配,会在Spring应用上下文中去寻找匹配某个Bean需求。这个注解不仅能够用在构造器的方法上,还可以用在setter方法上。若没找到Bean会抛出异常。@Autowried(required=false),这种声明方式,先尝试去执行自动装配,若没找到对应的Bean,则会让这个Bean处于未装配的状态。 |
@Autowired | 按照类型的方式注入 |
@Resource | 默认按名称装配,当找不到与名称匹配的bean时,才会按类型装配。 |
注入
1、注入的方式:
- 使用属性的setter方法注入 这是最常用的方式;
- 使用构造器注入;
- 使用Filed注入(用于注解方式)
2、注解的方式注入:
使用@Autowired或@Resource注解方式进行Spring的依赖注入
- @Autowired是按照类型的方式注入
- @Resource默认按名称装配,当找不到与名称匹配的bean时,才会按类型装配。