一.IoC概念
在最初学习的时候,我们通过new的方式创建一个对象
@Test
public void test(){
UserService service = new UserServiceImpl();
service.getUser();
}
在这个过程中,我们是主动的,我们程序员需要用程序去管理对象的创建。这样一来,程序的耦合性就会很高,每次改动代码需要的代价就越昂贵。
但是,如果我们进行一下改变,
public class UserServiceImpl implements UserService {
private UserDao userDao;
// 利用set实现
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
//测试类
@Test
public void test(){
UserServiceImpl service = new UserServiceImpl();
service.setUserDao( new UserDaoMySqlImpl() );
service.getUser();
//那我们现在又想用Oracle去实现呢
service.setUserDao( new UserDaoOracleImpl() );
service.getUser();
}
利用set的这种方式,在我们需要对象的时候,直接向工厂索要,让工厂为我们创建查找。这样,我们的程序是被动的,主动权给了使用者,程序不需要再去管理对象的创建,降低耦合性
这种被动接受资源的方式获取对象的思想就是控制反转, 控制反转IoC(Inversion of Control),是一种设计思想,**DI(依赖注入)**是实现IoC的一种方法 。 IoC是Spring框架的核心内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l3t7oOox-1621415494619)(C:\Users\DELL\Desktop\重要文档\笔记\Java\JavaSpring\img\aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy91SkRBVUtyR0M3S3REaWFPcUZ5NW91cmxKOEZUVlYyRkZ1WWlibWF2bEJIcTllNGNEcWljbHBZU0c4VlQ0RWljVnNucUtwNjV5SktRZU5pYnNWZFRpYWhRaWJKU2cvNjQw.png)]
在没有IoC的程序中,对象的创建与对象间的依赖关系都编码在程序中,对象的创建由程序控制
在IoC的程序中,对象的创建转移给第三方,程序不再管理对象的创建,只需要调用即可。从而解决程序的耦合
二. IoC的实现方式
-
使用XML配置
Bean的定义信息是和实现分离的
-
使用注解配置
-
新版本Spring零配置实现IoC
即 Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的
Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象
三. Spring基于XML实现IoC
Bean的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--bean就是java对象 , 由Spring创建和管理-->
<bean id="hello" class="com.kuang.pojo.Hello">
<property name="name" value="Spring"/>
</bean>
</beans>
beans标签:用于配置Sprin 创建对象,并且存入 ioc 容器之中
id属性:对象的唯一标识,相当于对象名
class属性:指定要创建对象的全称类名,默认情况下调用无参构造参数。
name:别名,并且可以同时取多个别名
scope属性:指定对象的作用范围
- singleton:默认值,单例
- prototype:多例
- request:WEB项目中,Spring创建的一个Bean对象,将对象存在request域中。
- session:WEB项目中,Spring创建的一个Bean对象,将对象存在session域中。
- global session:WEB项目中,应用在Protlet环境,如果没有Protlet环境那么globalSession相当于session。作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session。
init-method:指定类中的初始化方法名称
destroy-method:指定类中销毁方法的名称
创建Bean的三种方式
第一种:使用默认的五参数构造函数
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
在上下文环境获取之后,对象已经通过无参数构造创建好了
在spring的配配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签。
采用的就是默认的构造函数创建bean对象,此时如果类中没有默认的构造函数,则无法创建对象。
第二种:通过有参构造方法来创建
<!-- 第一种根据index参数下标设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
<!-- index指构造方法 , 下标从0开始 -->
<constructor-arg index="0" value="kuangshen2"/>
</bean>
<!-- 第二种根据参数名字设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
<!-- name指参数名 -->
<constructor-arg name="name" value="kuangshen2"/>
</bean>
<!-- 第三种根据参数类型设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
<constructor-arg type="java.lang.String" value="kuangshen2"/>
</bean>
别名
<!--设置别名:在获取Bean的时候可以使用别名获取-->
<alias name="userT" alias="userNew"/>
import
一般用于团队开发,将多个不一样的Bean文件导入
<import resource="{path}/beans.xml"/>
的时候可以使用别名获取–>
##### import
一般用于团队开发,将多个不一样的Bean文件导入
```java
<import resource="{path}/beans.xml"/>