本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net
背景
我们谈到 Spring 的时候一定会提到 IOC 容器、DI 依赖注入,Spring 通过将一个个类标注为 Bean 的方法注入到 IOC 容器中,达到了控制反转的效果。那么我们刚开始接触 Bean 的时候,一定是使用 xml 文件,一个一个的注入,就例如下面这样。
我们的项目一般很大的话,就需要成千上百个 Bean 去使用,这样写起来就很繁琐。那么 Spring 就帮我们实现了一种通过注解来实现注入的方法。只需要在你需要注入的类前面加上相应的注解,Spring 就会帮助我们扫描到他们去实现注入。
xml 扫描包的方式
<context:component-scan base-package=“com.company.beandemo”/>
通过注解注入的一般形式
一般情况下,注入 Bean 有一个最直白,最易懂的方式去实现注入,下面废话先不多说,先贴代码。
- Bean 类
public class MyBean{
}
- Configuration 类
// 创建一个 class 配置文件
@Configuration
public class MyConfiguration{
// 将一个 Bean 交由 Spring 进行管理
@Bean
public MyBean myBean(){
return new MyBean();
}
}
- Test 类
与 xml 有一点不同,这里在 Test 中,实例化的不再是 ClassPathXmlApplicationContext,而是获取的 AnnotationConfigApplicationContext 实例。
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);
MyBean myBean = cotext.getBean(“myBean”,MyBean.class);
System.out.println("myBean =" + myBean);
上面的代码中 MyBean 也就是我们需要 Spring 去管理的一个 Bean,他只是一个简单的类。而 MyConfiguration 中,我们首先用 @Configuration 注解去标记了该类,这样标明该类是一个 Spring 的一个配置类,在加载配置的时候会去加载他。
在 MyConfiguration 中我们可以看到有一个方法返回的是一个 MyBean 的实例,并且该方法上标注着 @Bean 的注解,标明这是一个注入 Bean 的方法,会将下面的返回的 Bean 注入 IOC。
通过构造方法注入 Bean
我们在生成一个 Bean 实例的时候,可以使用 Bean 的构造方法将 Bean 实现注入。直接看代码
- Bean 类
@Component
public class MyBeanConstructor {
private AnotherBean anotherBeanConstructor;
@Autowired
public MyBeanConstructor(AnotherBean anotherBeanConstructor){
this.anotherBeanConstructor = anotherBeanConstructor;
}
@Override
public String toString() {
return “MyBean{” +
“anotherBeanConstructor=” + anotherBeanConstructor +
‘}’;
}
}
- AnotherBean 类
@Component(value=“Bean 的 id,默认为类名小驼峰”)
public class AnotherBean {
}
- Configuration 类
@Configuration
@ComponentScan(“com.company.annotationbean”)
public class MyConfiguration{
}
这里我们可以发现,和一般方式注入的代码不一样了,我们来看看新的注解都是什么意思:
- @AutoWired
简单粗暴,直接翻译过来的意思就是自动装配🔧,还不理解为什么叫自动装配🔧?看了下一个注解的解释你就知道了。若是在这里注入的时候指定一个 Bean 的 id 就要使用 @Qualifier 注解
- @Component(默认单例模式)
什么??这翻译过来是零件,怎么感觉像是修汽车??是的,Spring 管理 Bean 的方法就是修汽车的方式。我们在需要将一个类变成一个 Bean 被 Spring 可以注入的时候加上注解零件 @Conmonent,那么我们就可以在加载 Bean 的时候把他像零件一样装配🔧到这个 IOC 汽车上了
在这里我们还有几个其他的注解也可以实现这个功能,也就是细化的 @Component:
-
@Controller 标注在 Controller 层
-
@Service 标注在 Service 层
-
@Repository 标注在 dao 层
-
@ComponentScan(“”)
还是翻译,零件扫描,我们去看看括号里的 “零件仓库” 里面,哪些“零件”(类)需要被装载,Spring 就会去扫描这个包,将里面所有标注了 @Component 的类进行注入。
这里的通过构造方法进行注入就很好理解了,我们在装配 MyBean 这个零件的时候,突然发现他必须在 AnotherBean 的基础上才能安装到 IOC 里面,那么我们就在每次装配 MyBean 的时候自动装配🔧一个 AnotherBean 进去。举个🌰吧:
还是以汽车为例,我们在踩油门出发之前,是不是必须发车??这里的 AutoWired 的内容就像发车,你不发车,这个油门你踩断都没有用,他都不会走。
通过 set 方法注入 Bean
我们可以在一个属性的 set 方法中去将 Bean 实现注入,看代码吧
- MyBean 类
@Component
public class MyBeanSet {
private AnotherBean anotherBeanSet;
@Autowired
public void setAnotherBeanSet(AnotherBean anotherBeanSet) {
this.anotherBeanSet = anotherBeanSet;
}
@Override
public String toString() {
return “MyBeanSet{” +
“anotherBeanSet=” + anotherBeanSet +
‘}’;
}
}
- Configuration 类 和 Test 类
同上一个,就不贴了
这里我们发现在 setter 方法上我们有一个 @AutoWired, 与上面不同的是,我们不会在实例化该类时就自动装配🔧这个对象,而是在显式调用 setter 的时候去装配。
通过属性去注入 Bean
我们前面两种注入的方式诸如时间不同,并且代码较多,若是通过属性,即就是
@Component
public class MyBeanProperty {
@Autowired
private AnotherBean anotherBeanProperty;
@Override
public String toString() {
return “MyBeanProperty{” +
“anotherBeanProperty=” + anotherBeanProperty +
‘}’;
}
}
这里我们可以看到我们这个类中需要使用 AnotherBean 这个实例对象,我们可以通过 @AutoWired 去自动装配它。
对于有些小伙伴问私有属性,Spring 怎么去加载它到 IOC 的?推荐去看看反射
通过 List 注入 Bean
- MyBeanList 类
@Component
自我介绍一下,小编 13 年上海交大毕业,曾经在小公司待过,也去过华为、OPPO 等大厂,18 年进入阿里一直到现在。
深知大多数 Java 工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024 年 Java 开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。


既有适合小白学习的零基础资料,也有适合 3 年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了 95% 以上 Java 开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注 Java 获取)

总结
面试前的 “练手” 还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。
我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。
面试题及解析总结

大厂面试场景

知识点总结

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
yle=“zoom: 33%;” />
总结
面试前的 “练手” 还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。
我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。
面试题及解析总结
[外链图片转存中…(img-awT9z5xR-1713389633829)]
大厂面试场景
[外链图片转存中…(img-v4DeAoIH-1713389633830)]
知识点总结
[外链图片转存中…(img-QdgeboOj-1713389633830)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!