一、概念
1.IOC的概念
-
IOC控制反转
是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。是一种概念,是一种思想。控制反转就是指把对象的控制权转移,从程序代码本身反转到了外部容器。把对象的创建、初始化、销毁工作交给spring容器去处理。由spring容器控制对象的生命周期。SpringIOC负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。) -
DI依赖注入
依赖注入DI是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖外部容器,由外部容器创建后传递给程序。依赖注入是目前最优的解耦方式。依赖注入让Spring的Bean之间以配置文件的方式组织在一起,而不是以硬编码的方式耦合在一起的。 -
IOC与DI的关系
IOC是一个概念,是一种思想,其实现方式有很多种。当前比较流行的实现方式之一是DI
IOC:控制反转,本质就是将对象new的过程交给Spring容器去管理
二、Spring的实现
1.基本实现步骤
1.1 创建项目并导入依赖
1.2 创建Spring配置文件
1.3 添加java类
1.4 配置文件注册Bean类
1.5 Java代码实现
2.getBean方法
我们从IOC容器中获取对应的对象是通过getBean方法实现的,默认是调用的无参构造方法,如果不存在该方法就会抛出异常
2.1 根据name获取
2.2 根据id获取
2.3 根据class获取
2.4 组合方式获取
3.id和name的区别
id=“id1,d2,id3”
表示bean有一个名字,就这个名字就叫"id1,id2,id3"
name=“name1,name2,name3”
表示bean有多个名字,分别是name1、name2和name3
4.BeanFactory和ApplicationContext的区别
BeanFactory是ApplicationContext接口的一个父接口,ApplicationContext接口定义的功能肯定要比BeanFactory接口定义的功能要强大。
BeanFactory仅仅只会加载解析配置文件,并不会创建具体的实例对象
5.IOC对象工厂注入
工厂模式的特性
①对于调用者来说,隐藏了复杂的逻辑处理过程,调用者只关心执行结果。
②工厂要对结果负责,保证生产出符合规范的产品
5.1 静态工厂注入
通过工厂类的静态方法获取对应的实例对象
5.1.1 步骤
工厂类内创建对象的方法必须是static修饰
测试代码
5.2 动态工厂注入
通过工厂类的普通方法获取实例对象
6.基于配置方式的属性注入
属性注入:如何给对象的属性设值
6.1 构造注入
通过构造方法实现属性的注入,第一步需要添加对应的有参构造方法,第二部在配置文件中添加对应的配置信息
①添加有参构造方法
②配置文件中的配置
③还有一种简化方式的配置:c名称空间
6.2 设值注入
设值注入:就是通过bean对象的setter和getter方法来设置或获取对象的属性信息,这样一来有参构造方法就不是必须了
①setter方法是必须的
②配置文件信息
③简化配置:p名称空间
6.3 对象注入
如果初始化的属性的类型是自定义的对象,那么注入的时候可以通过ref属性来从IOC容器中获取合适的对象注入
6.4 集合和数组的注入
6.5 Map和Properties类型注入
7.基于注解的形式
配置文件的实现方式在bean对象比较多的情况下,配置文件会越来越复杂,这是我们可以通过扫描加注解的方式来简化我们的操作。
7.1添加AOP支持依赖
基于注解的方式需要用到AOP的支持,所以我们需要添加AOP的依赖
7.2 添加扫描
通过context标签的component-scan属性指定我们的扫描路径
7.3 @Component注解
@Component注解,被该注解表示的Java会被SpringIOC容器加载
7.4 @Resource和@Autowired
在注解的场景下依赖注入我们可以通过@Resource和@Autowired实现,他们的区别是 @Resourse默认是根据name属性来查找的,而@Autowired注解默认是根据类型查找的,@Autowired需要和@Qualifier配合实现name的查找
注入普通类型的属性是:@Value(value = “CodeTiger”)
7.5 注入的注解
注解 | 描述 |
---|---|
@Component | 一般在身份不明确的组件上 |
@Service | 一般在Service层 |
@Controller | 一般在控制层 |
@Repository | 一般在数据库访问层 |
特殊的扫描条件
8.Java配置类
Java配置类是在Spring3.x之后开始支持的,从而舍弃配置文件的形式
8.1 Java配置类的使用
Java配置类需要通过@Configuration注解标注,需要加载的实例需要通过@Bean注解标注
Java配置类的作用和applicationContext.xml的作用是一样的
8.2 @ComponentScan注解
基于Java配置类的实现方式中要结合@Component注解使用的话,添加扫描我们需要通过@ComponentScan或者@ComponentScans注解要实现
8.3 @Conditional注解
可以通过@Conditional注解去控制Bean对象的载入
8.3.1 步骤
创建一个控制条件的类,要继承Condition
8.4 @Profile注解
在实际开发中,我们的项目会经理许多不同的环境(开发环境,测试环境,生产环境)
applicationContext.getEnvironment().setActiveProfiles(“环境名称”); 设置对应的环境信息
applicationContext.register(java配置类); 关联配置类
applicationContext.refresh(); 刷新容器
package com.biao.spring.Entity;
public class DataSource {
private String url;
private String uname;
private String pass;
public DataSource(String url, String uname, String pass) {
this.url = url;
this.uname = uname;
this.pass = pass;
}
@Override
public String toString() {
return "DataSource{" +
"url='" + url + '\'' +
", uname='" + uname + '\'' +
", pass='" + pass + '\'' +
'}';
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}
9.Bean的作用域
scope:默认是singleton 单例模式,每次获取的都是同一个对象
prototype 每次从容器获取的都是一个新对象
配置文件
Java配置类