一提到 Spring
,大家最先想到的是啥?是 AOP
和 IOC
的两大特性?是 Spring
中 Bean
的初始化流程?还是基于 Spring
的 Spring Cloud
全家桶呢?
今天我们就从 Spring
的 IOC
特性入手,聊一聊 Spring
中把 Bean
注入 Spring
容器的几种方式。
我们先来简单了解下 IOC
的概念: IOC
即 控制反转 ,也称为 依赖注入 ,是指将 对象的创建 或者 依赖关系的引用 从具体的对象控制转为框架或者 IOC
容器来完成,也就是依赖对象的获得被反转了。
“
可以简单理解为原来由我们来创建对象,现在由 Spring
来创建并控制对象。
”
xml 方式
依稀记得最早接触 Spring
的时候,用的还是 SSH
框架,不知道大家对这个还有印象吗?所有的 bean
的注入得依靠 xml
文件来完成。
它的注入方式分为: set
方法注入、构造方法注入、字段注入,而注入类型分为值类型注入(8种基本数据类型)和引用类型注入(将依赖对象注入)。
以下是 set
方法注入的简单样例
<bean name="teacher" class="org.springframework.demo.model.Teacher">
<property name="name" value="阿Q"></property>
</bean>
对应的实体类代码
public class Teacher {
private String name;
public void setName(String name) {
this.name = name;
}
}
xml方式存在的缺点如下:
-
xml
文件配置起来比较麻烦,既要维护代码又要维护配置文件,开发效率低;
-
项目中配置文件过多,维护起来比较困难;
-
程序编译期间无法对配置项的正确性进行验证,只能在运行期发现并且出错之后不易排查;
-
解析 xml
时,无论是将 xml
一次性装进内存,还是一行一行解析,都会占用内存资源,影响性能。
注解方式
随着 Spring
的发展, Spring 2.5
开始出现了一系列注解,除了我们经常使用的@Controller、@Service、@Repository、@Component 之外,还有一些比较常用的方式,接下来我们简单了解下。
@Configuration + @Bean
当我们需要引入第三方的 jar
包时,可以用 @Bean
注解来标注,同时需要搭配 @Configuration
来使用。
简单样例:将 RedisTemplate 注入 Spring
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
......
return redisTemplate;
}
}
@Import
我们在翻看